Macro en Excel que busque, corte y pegue

Necesito una macro que busque en la hoja “2016” filas que contengan un registro que se llame “Accomodation, Regular”, corte todas las filas en las que aparezca y las pegue en una hoja que se llame Accomodation, Regular del mismo libro y debajo del la fila que contiene los títulos.

1 Respuesta

Respuesta
1

.

Buenas, Francisco

La siguiente rutina hace lo que solicitas, utilizando los filtros avanzados de MS Excel.

Para que funcione, necesitas colocar los titulos de las columnas de la base original que necesitas que aparezcan en la hoja Accomodation, Regular. Si fueran todos, copia la linea de la base original y pegala en la hoja mencionada. Es decir, puedes extraer todos los campos de la base original o solo aquellos que te interese.

Luego, y esto es fundamental, elige un rango libre de dos lineas y una columna en la hoja de destino donde colocar el criterio de extracción, por ejemplo BB1:BB2

En la primera celda de esas dos coloca el mismo título de la columna donde esté el dato clave y abajo el criterio: “Accomodation, Regular”

Algo así como esto:

Luego, accede al Editor de VBA (Atajo: Alt + F11), inserta un módulo - si no tuvieras uno ya- y pega el siguiente código:

Sub SacaLineas()
'---- Variables modificables:
'=== FRANCISCO, modifica estos datos de acuerdo a tu proyecto:
            HojaOrig = "2016"
            HojaDest = "Accomodation,Regular"
            CritAreaH = "BB1:BB2" 'rango donde se coloca el criterio de extracción
            SourceAreaH = "A12:CY14000" ' rango base de datos de origen
            OutpAreaH = "A13:BH13" ' fila de títulos en hoja de destino
'---- fin Variables
'
'---- inicio de rutina:
'  
            Sheets(HojaDest).Select
            Sheets(HojaOrig).Range(SourceAreaH).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range(CritAreaH), _
                CopyToRange:=Range(OutpAreaH), Unique:=False
End Sub

Veras al inicio del código unas variables que deberás adaptar a los rangos propios de tu libro.

Como verás, esta forma flexibiliza lo que quieras extraer, simplemente cambiando el criterio en el rango que indicaste.

.

Hola Fernando, 

Muchas gracias por tu respuesta y avisarte que mis conocimientos sobre VBA son mas bien escasos. He hecho lo que he entendido en tu respuesta pero me da un error de compilación.

Sería posible mandarte la hoja y que la vieras?

Muchísimas gracias y un abrazo desde Madrid

Francisco J. García

.

Buenas, Francisco

Donde te marca el error es porque escribiste el nombre de la hoja sin comillas. En realidad, alli debería ir el nombre de la variable HojaDest (sin comillas) que ya tiene cargado el nombre de la hoja de destino. Otro tanto pasa con la hoja de origen y con las otras variables.

No deberías haber reemplazado los nombres de las variables en la instrucción.

Deberías haber pegado la rutina tal como te la envié y, eventualmente, cambiar los rangos en el sector de variables que te dejé debidamente delimitado.

Es decir, los datos que deberías modificar son los que están despues del signo igual en estas variables:

CritAreaH = "BB1:BB2" 'rango donde se coloca el criterio de extracción
SourceAreaH = "A12:CY14000" ' rango base de datos de origen
OutpAreaH = "A13:BH13" ' fila de títulos en hoja de destino

Respetando, claro está, el comillado que tienen

Prueba con estas indicaciones y dime si anduvo.

Saludos

Fer

.

Hola Fernando,

no me ha funcionado. Dejando la macro original me da el siguiente error

Siento mucho molestarte tanto.

Saludos

.

Ok, Francisco

El mensaje de error ahora es otro, porque la sintaxis de la rutina es correcta.

Faltaría que me confirmes si los rangos que yo indiqué coinciden con los tuyos (poco probable)

Deberías colocar en cada caso los reales de tu planilla o comentame qué rango ocupa la base, a qué rango debería extraer los datos y finalmente, si el rango de criterios es el mismo que indiqué o lo pusiste en otra ubicación.

Con esos datos podremos corregir la rutina.

Un abrazo

Fer

.

Hola Fernando

Te comento:

CritAreaH = "Q1:Q2" 'rango donde se coloca el criterio de extracción
Entiendo que aquí debo poner la columna donde se va a poner lo que se extrae de la hoja original.

SourceAreaH = "B1:BP5000" ' rango base de datos de origen
Aquí pongo el rango de donde se va a extraer los datos en la hoja original

OutpAreaH = "A1:BP1" ' fila de títulos en hoja de destino
Aquí pongo la fila que contiene los títulos de la hoja de destino

Ejecuto y me da el siguiente error

Agradecerte las molestias que te tomas.

Saludos

.

Buenas, Francisco

Estás muy cerca de lograrlo.

Fíjate que el área de la base de datos empieza en la columna B (hasta BP), mientras que la de extracción comienza en la columna A (hasta BP), por lo que tienes una columna más que la rutina no sabe qué hacer con ella.

Entonces, ajusta ambos rangos para que coincidan.

Recuerda que, en el área donde quieres que te deje los datos debe contener los títulos de campo IGUAL a como están escritos en la base de datos original. Pueden ser todos o algunos, o duplicados, o en cualquier orden, pero todas las celdas deben tener su encabezado para que no te salga un error como el que muestra la imagen que pasaste.

Creo que ya lograras tu objetivo siguiendo las instrucciones que te compartí.

Un abrazo

Fer

.

Hola Fernando,

Ya hemos conseguido que no dé ningún error

Pero la macro no hace lo que necesito. 

Necesitaría que cuando se ejecute la macro:

- que corte todas las filas de la hoja "2016" que contengan "Accomodation, Regular"

-pegue toda la fila en la hoja que se llama "Accomodation, Regular" (la cual tiene los mismos títulos)

-borre todas las filas de la hoja "2016" que hayan quedado en blanco.

-y que cuando vuelva a poner nuevos registros en la hoja "2016" y ejecute nuevamente la macro los incremente en la hoja "Accomodation, Regular".

Quiero agradecerte la ayuda que me estás prestando y disculparme por el trabajo que te estoy dando.

Muchas gracias y saludos

Francisco

.

Hola, Francisco

Si bien los filtros avanzado permiten, además de extractar en otro lugar, filtrar en la misma base -lo que permitiría eliminar las lineas que cumplan con el criterio- se complica mantener lo que hayas extractado antes porque la nueva consulta pisaría lo anterior.

Por lo tanto, estamos frente a otro animal. La rutina para hacer lo que quieres será distinta a la que te compartí originalmente. De allí la demora en responderte.

Ya no será necesaria el área de criterios y el registro a buscar lo indicarás dentro del siguiente código:

Sub SacaLineas()
'---- Variables modificables ----
'=== FRANCISCO, modifica estos datos de acuerdo a tu proyecto:
    HojaOrig = "2016" 'hoja donde está la base original
    Buscar = "Accomodation,Regular" 'texto a buscar
    HojaDest = "Accomodation,Regular" ' Hoja donde dejar las lineas
    TitDestino = "A13:BH13" ' fila de títulos en hoja de destino
'---- fin Variables
'
'---- inicio de rutina:
'  
UltFila = Sheets(HojaDest).Range(Left(TitDestino, 1) & Rows.Count).End(xlUp).Row
cont = 0
Sheets(HojaOrig).Select
Do
    On Error Resume Next
    Encontrado = Cells.Find(What:=Buscar, LookAt:=xlWhole).Row
    If Err.Number = 0 And Len(Encontrado) > 0 Then
        Range("A" & Encontrado).EntireRow.Copy
        Sheets(HojaDest).Range(Left(TitDestino, 1) & UltFila + 1).PasteSpecial Paste:=xlPasteValues
        Sheets(HojaDest).Range(Left(TitDestino, 1) & UltFila + 1).PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
        Range("A" & Encontrado).EntireRow.Delete
        cont = cont + 1
        UltFila = UltFila + 1
    Else
        GoTo TheEnd
    End If
Loop While Len(Encontrado) > 0
TheEnd:
Err.Clear
On Error GoTo 0
ElMensaje = IIf(cont = 0, "NO SE TRASLADO LINEA ALGUNA, porque" & Chr(10) & "no se encontró " & Buscar & " en la hoja " & HojaOrig, "Se transfirieron: " & cont & " linea" & IIf(cont > 1, "s", "") & Chr(10) & "a la hoja " & HojaDest)
TipoMens = IIf(cont = 0, vbCritical, vbInformation)
ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!")
Application.ScreenUpdating = True
MsgBox ElMensaje, TipoMens, ElTitulo
End Sub

Espero que ahora sí quedes satisfecho.

Un abrazo

Fer

.

Hola Fer,

lo compruebo y te digo algo.

Muchas gracias y saludos

Francisco.

.

Ok, Francisco

Ojalá sea lo que buscabas.

Muy buen fin de semana

Fer

.

Buenos días Fer

!Fantástico, ha funcionado perfectamente.

Te agradezco muchísimo las molestias que te has tomado para ayudarme.

Ahora me queda mucho trabajo por delante para desarrollar esta hoja, pero espero contar con tu inestimable si me vuelvo a ver atascado.

Muchas gracias y un fuerte abrazo.

Francisco

.

Un placer poder ayudar.

Un abrazo

Fer

.

Hola Fer,

Vuelvo a necesitar de tus conocimientos, creo que esta es más fácil que la anterior aunque no es de macro sino de fórmulas.

Necesito que se active un hipervínculo que hay en una celda, cuando en otra celda dé un valor "Correcto"

Como siempre muchas gracias y un abrazo

Francisco

.

En el mensaje de mi perfil había colocado que estaría de vacaciones hasta hoy, de allí la demora en responderte.

En otra época hubiese sido necesario una rutina de VBA, pero hoy puedes usar una fórmula como esta para crear un hipervínculo:

=HIPERVINCULO("[Archivo.xlsx]'Hoja1'!B14";"Click aqui")

[Considera si usas comas o punto y coma para separar argumentos de las funciones. Yo usé ";"]

Desde luego, deberás reemplazar el nombre del archivo, hoja y celda donde quieres que te lleve esa celda.

Entonces sólo falta anidar esa función con un condicional para que se active cuando encuentre "Correcto" en otra celda, supongamos F2. Entonces tu fórmula final sería:

=SI($F$2="Correcto";HIPERVINCULO("[Archivo.xlsx]'Hoja1'!B14";"Click aqui");"")

Un abrazo

Fer

.

Hola Fer,

Espero que hayas disfrutado de tus vacaciones.

Si ha funcionado la fórmula, pero no me explicado lo suficiente.

Lo que intento es que cuando se de la condición de "correcto" se ejecute un sonido que esta enlazado mediante un hipervínculo.

La fórmula :

=SI($D$2="Correcto";HIPERVINCULO("[Audios\Scared.mp3]")) 

No se ejecuta si no hago click en la casilla donde reside la fórmula y esta "Correcto" a la celda que hace referencia.

¿Seria posible que se ejecutara el sonido automáticamente cuando D2 estuviera correcto?

Muchas gracias por tus indicaciones.

Un abrazo

.

Buenas, Francisco

Efectivamente, esa aclaración cambia radicalmente la pregunta (de hecho, a esta altura ya deberías haber abierto otra, porque se están mezclando temas).

Entonces sí necesitarás una rutina de Visual Basic que asociaremos al evento de que cambie el contenido de la celda D2. Además será necesaria una función API que se declara al inicio para poder reproducir achivos WAV (solamente).

Para que funcione, activa el editor de Visual Basic (presiona Alt+F11) y en el panel de la izquierda busca la hoja donde quieres que esto ocurra. Da doble click sobre ella. (Otra forma de llegar a este punto es hacer click derecho sobre la solapa de esta hoja y elegir la opción "Ver Código)

Allí pega el siguiente código:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------  
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== LUIS, modificá estos datos de acuerdo a tu proyecto:
CeldaCtrl = "$D2"
Clave = "Correcto"
CarpetaSon = "C:\Audios"
CarpetaSon = "C:\Windows\Media" 'elimina esta linea para usar la variable de la fila anterior
ArchivoSon = "Scared.mp3" ' <<<< debe ser .wav !!!!
ArchivoSon = "Chimes.wav" 'elimina esta linea para usar la variable de la fila anterior
'---- fin Variables
'
'---- inicio de rutina:
'  
ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
If Target.Address(False, False) = CeldaCtrl And Range(CeldaCtrl).Value = Clave Then Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
End Sub

Espero que sea lo que buscas.

Un abrazo

Fer

.

Hola Fer,

siento mucho abusar de tu confianza, pero soy consciente de la limitación de mis conocimientos informáticos y, a veces creo que las cosas se pueden hacer de manera sencilla y personas como tu, me demuestran lo equivocado que estoy.

No estoy seguro de haber modificado correctamente el código que me mandas, 

Entiendo que la CarpetaSon es donde están los archivos wav que quiero que se ejecuten cuando en la casilla D2 (tengo esta formula =SI(B2=C2;"Correcto";"Incorrecto")) aparezca Correcto.

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== LUIS, modificá estos datos de acuerdo a tu proyecto:
CeldaCtrl = "$D2"
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
ArchivoSon = "Scared.wav" ' <<<< debe ser .wav !!!!
'---- fin Variables
'
'---- inicio de rutina:
'
ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
If Target.Address(False, False) = CeldaCtrl And Range(CeldaCtrl).Value = Clave Then Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
End Sub

Siento que por mi desconocimiento se este alargando mucho esta pregunta

Muchas gracias y un abrazo

.

Hola, Francisco

La rutina que te envié está atada a que se produzca un cambio físico en determinada celda.

Veo en tu caso que D2 tiene una fórmula por lo que cambiará el resultado pero no lo que tiene dentro (la fórmula es la misma).

Por tanto, asociaremos la rutina a las celdas que sí cambian B2 y C2, asumiendo que estas no sean, a su vez, otras celdas con fórmulas.

Sustituye todo lo que había en aquel panel de VBA por el siguiente:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== FRANCISCO, modificá estos datos de acuerdo a tu proyecto:
'
CeldaCambio1 = "B2" 'celda que se modifica
CeldaCambio2 = "C2" 'celda que se modifica
'
CeldaCtrl = "D2" 'Celda con fórmula
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
ArchivoSon = "Scared.wav" ' <<<< debe ser .wav !!!!
'---- fin Variables
'
'---- inicio de rutina:
'  
ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
If Target.Address(False, False) = UCase(CeldaCambio1) Or Target.Address(False, False) = UCase(CeldaCambio2) Then
    ActiveSheet.Calculate
    If Range(CeldaCtrl).Value = Clave Then Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
End If
End Sub

Desde luego, asegúrate de que el archivo de sonido sea, realmente, WAV (supongo que no le habrás cambiado la extensión solamente).

Respecto a la extensión de la pregunta, no tengo ningún problema en seguir hasta que esté agotado el tema. Es sólo que empezó como "Macro en Excel que busque, corte y pegue" y ahora estamos viendo cómo producir un sonido condicionalmente. Son dos temas distintos y deberían haber sido dos preguntas distintas. En particular por si esto le sirviera a alguien más.

Simplemente, tenlo en cuenta para próximas preguntas.

Un abrazo

Fer

.

Hola Fer,

Ha funcionado perfectamente.

Pero necesito dar un paso más (espero que sea el definitivo), realmente es toda la columna "C" la que se modifica, al igual que es toda la columna "D" la que contiene las fórmulas y en ArchivoSon debería poner todos los WAV pero no se la forma de ponerlos (quizás así "Scared.wav" "Not Yet")

La intención del excel es enseñar a niños palabras en inglés básico y cuando acierten que se reproduzca el sonido.

Muchas gracias y un fuerte abrazo

Francisco

.

Ok, eso cambia las cosas... Pero no mucho

Por lo que veo sólo se ingresan datos en la columna C y oculto, en la columna, B está el dato correcto.

Entonces la siguiente variante controla cualquier ingreso en la columna C y evalua la fórmula de columna D correspondiente a la celda donde se ingresó el ultimo dato:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== FRANCISCO, modificá estos datos de acuerdo a tu proyecto:
'
ColCambio = "C" 'celda que se modifica
ColCtrl = "D" 'Celda con fórmula
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
ArchivoSon = "Scared.wav" ' <<<< debe ser .wav !!!!
'---- fin Variables
'
'---- inicio de rutina:
'
ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
If Target.Column = Range(UCase(ColCambio) & "1").Column Then
    ActiveSheet.Calculate
    If Range(UCase(ColCambio) & Target.Row).Value = Clave Then Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
End If
End Sub

Imagino que estará OK con ese cambio.

Abrazo

Fer

.

Hola Fer,

Ahora no reproduce el sonido de la primera fila que se llama "Scared.wav"

Entiendo que en ArchivoSon deberían ir todos los ficheros wav, pero ¿como los debería escribir (quizás así "Scared.wav" "Not Yet")?

Saludos

Francisco

.

Buen día, Francisco

Me parece que recién estoy entendiendo -porque no lo mencionaste antes- que tienes varios nombres de archivo -no solo scared.wav- en alguna parte de tu planilla. Es decir uno por cada expresión a traducir.

Suponiendo que los tuvieras en la columna E (que noto oculta), esta rutina traerá el nombre de ese archivo y lo hará sonar:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== FRANCISCO, modificá estos datos de acuerdo a tu proyecto:
'
ColCambio = "C" 'Columna que se modifica
ColCtrl = "D" 'columna con fórmula de Control
ColArchSon = "E" 'columna con Nombre archivo de Sonido
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
'---- fin Variables
'
'---- inicio de rutina:
'  
If Target.Column = Range(UCase(ColCambio) & "1").Column Then
    ActiveSheet.Calculate
    If Range(UCase(ColCambio) & Target.Row).Value = Clave Then
        ArchivoSon = Range(UCase(ColArchSon) & Target.Row).Value & ".wav"
        ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
        Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
    End If
End If
End Sub

Ten en cuenta que ese sea el nombre exacto del archivo de sonido. En las pruebas que hice, costó que reconozca algunos wav que tenían nombres con espacios. Internamente, creo, los maneja con otro nombre.

Saludos

Fer

.

Hola Fer,

Lamentablemente no ha funcionado, con esta rutina ni siquiera a funcionado con el primer sonido (scared.wav).

Efectivamente en la columna "E" están los hipervínculos a los sonidos wav.

Siento mucho todo el trabajo que te estoy dando.

Un abrazo

.

Buenas, Francisco

NO necesitas hipervínculos a los archivos de sonido, funciona con el nombre del archivo. La extensión .wav también se la agrega la rutina

Entonces, en la columna E coloca solo el nombre del archivo a ejecutar.

Saludos

Fer

.

Hola Fer

he quitado los hipervínculos y sigue sin funcionar.

¿que crees que puede suceder?

Un abrazo

Francisco

.

Buenas, Francisco

Más cerca.

En el mensaje anterior te había indicado: coloca solo el nombre del archivo a ejecutar

Veo que lo dejaste con la extensión, entonces, como la rutina también la agrega, se duplica

Imagino que con esto ya lo deberías lograr.

Saludos

Fer

.

Hola Fer,

le he quitado la extensión y sigue sin funcionar.

Un abrazo

Francisco

.

Es curioso que alguna vez haya funcionado y ahora no.

Revisé, y no encuentro problema con la rutina en sí. Me inclino a pensar que hay algo con esos archivos.

Imagino que habrás controlado que los archivos están efectivamente en la carpeta G:\Inglés\Excell\Audios, que los archivos sean .wav reales (no basta con cambiarle la extensión al archivo).

Saludos

Fer

.

Edite el archivo mp3 y lo guarde en wav.

La única rutina que funciono fue esta pero solo para una única celda

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== FRANCISCO, modificá estos datos de acuerdo a tu proyecto:
'
CeldaCambio1 = "B2" 'celda que se modifica
CeldaCambio2 = "C2" 'celda que se modifica
'
CeldaCtrl = "D2" 'Celda con fórmula
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
ArchivoSon = "Scared.wav" ' <<<< debe ser .wav !!!!
'---- fin Variables
'
'---- inicio de rutina:
'
ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
If Target.Address(False, False) = UCase(CeldaCambio1) Or Target.Address(False, False) = UCase(CeldaCambio2) Then
    ActiveSheet.Calculate
    If Range(CeldaCtrl).Value = Clave Then Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
End If
End Sub

Siento darte tanto trabajo

Un abrazo

.

Ok, Francisco

Lo importante es que logres hacerlo funcionar.

Intenta con esta rutina. Como no tengo esos archivos le incluí una instrucción para que me muestre cada archivo que elije y lo hacía correctamente. En esta versión que te paso está anulada pero si te fallara, puedes activarla quitando el apostrofo.

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== FRANCISCO, modificá estos datos de acuerdo a tu proyecto:
'
ColCambio = "C" 'Columna que se modifica
ColCtrl = "D" 'columna con fórmula de Control
ColArchSon = "E" 'columna con Nombre archivo de Sonido
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
'---- fin Variables
'
'---- inicio de rutina:
'  
If Target.Column = Range(UCase(ColCambio) & "1").Column Then
    ActiveSheet.Calculate
    If Range(UCase(ColCtrl) & Target.Row).Value = Clave Then
        ArchivoSon = Range(UCase(ColArchSon) & Target.Row).Value & ".wav"
        ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
        'MsgBox ElSonido '< Control de nombre de archivo  
        Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
    End If
End If
End Sub

Ahora sí debería funcionarte.

Abrazo

Fer

.

Hola Fer,

no ha funcionado y me da el siguiente error

No se cual es el apostrofo que hay que quitar

Un abrazo

Francisco

.

Buenas,

Primero pruébala así como está esta:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'----------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== FRANCISCO, modificá estos datos de acuerdo a tu proyecto:
'
ColCambio = "C" 'Columna que se modifica
ColCtrl = "D" 'columna con fórmula de Control
ColArchSon = "E" 'columna con Nombre archivo de Sonido
Clave = "Correcto"
CarpetaSon = "G:\Inglés\Excell\Audios"
'---- fin Variables
'
'---- inicio de rutina:
' 
If Target.Column = Range(UCase(ColCambio) & "1").Column Then
    ActiveSheet.Calculate
    If Range(UCase(ColCtrl) & Target.Row).Value = Clave Then
        ArchivoSon = Range(UCase(ColArchSon) & Target.Row).Value & ".wav"
        ElSonido = CarpetaSon & IIf(Right(CarpetaSon, 1) = "\", "", "\") & ArchivoSon
        'MsgBox ElSonido '< Control de nombre de archivo
        Call PlaySound(ElSonido, &H1, &H1 Or &H20000)
    End If
End If
End Sub

Si todo funciona como pretendes, no tienes nada más que hacer.

En caso de que volvieras a tener inconveniente para obtener el sonido, vé a la línea:

'MsgBox ElSonido '< Control de nombre de archivo

Y borra el primer caracter (') para que, antes de intentar acceder al archivo de sonido, te muestre la dirección completa del archivo que quiere utilizar. Esto te servirá para verificar si hay algun error.

Abrazo

Fer

.

Enhorabuena Fer,

Ahora si funciona, no sabes cuanto te agradezco tu trabajo. Mis más sinceras felicitaciones, muchísimas gracias.

Ya la próxima pregunta ya la haré como me comentaste.

Espero que un futuro pueda contar con tu inestimable ayuda.

Un fuerte abrazo

Francisco

.

Muy bien, Francisco

Me alegro mucho de que, finalmente, haya funcionado.

Desde luego, puedes contar conmigo para próximas consultas.

Un abrazo

Fer

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas