Un sub privado dentro de un sub
Resuelto
hcetat
Mensajes publicados
7
Fecha de registro
Estado
Miembro
Última intervención
-
hcetat Mensajes publicados 7 Fecha de registro Estado Miembro Última intervención -
hcetat Mensajes publicados 7 Fecha de registro Estado Miembro Última intervención -
Hola,
Le agradezco por su artículo titulado "VBA - Llamada de una macro en otra macro", muy bien escrito y muy claro.
Estoy intentando adaptar el código que usted proporciona en el ejemplo al caso que debo resolver.
No soy un experto en VBA y hay algo que se me escapa.
Aquí está el ejemplo de su artículo:
Private Sub Worksheet_Change(ByVal Target As Range)
'Si la celda afectada por el cambio no tiene la dirección A1 => salimos
If Target.Address <> "$A$1" Then Exit Sub
'Si el valor de la celda (es decir, A1) es > 10 entonces colocamos "¡No está mal!" en B1
If Target.Value > 10 Then Target.Offset(0, 1) = "¡No está mal!" Else Target.Offset(0, 1) = "¡No está bien!"
End Sub
Sub MaMacro()
Dim monRange As Range
Set monRange = Sheets("Feuil1").Range("A1")
Call Worksheet_Change(monRange)
End Sub
Si hago una macro sin modificar nada y la ejecuto, de inmediato, Excel coloca "no está bien" en B1 y luego, independientemente de lo que indique en A1, B1 no se modifica más.
Tal vez me equivoqué, pero esperaba que B1 se modificara en función del valor de A1.
¿Qué es lo que no entendí?
Además, aquí está lo que deseo hacer.
Un usuario debe hacer una elección en una lista de validación.
Una vez que se haya hecho, el programa debe continuar ejecutándose.
¿Puede decirme cómo hacer para llamar al programa después de que se haya hecho la elección?
Le agradezco de antemano por su respuesta.
Atentamente,
Henri
Configuración: Windows / Chrome 48.0.2564.116
Le agradezco por su artículo titulado "VBA - Llamada de una macro en otra macro", muy bien escrito y muy claro.
Estoy intentando adaptar el código que usted proporciona en el ejemplo al caso que debo resolver.
No soy un experto en VBA y hay algo que se me escapa.
Aquí está el ejemplo de su artículo:
Private Sub Worksheet_Change(ByVal Target As Range)
'Si la celda afectada por el cambio no tiene la dirección A1 => salimos
If Target.Address <> "$A$1" Then Exit Sub
'Si el valor de la celda (es decir, A1) es > 10 entonces colocamos "¡No está mal!" en B1
If Target.Value > 10 Then Target.Offset(0, 1) = "¡No está mal!" Else Target.Offset(0, 1) = "¡No está bien!"
End Sub
Sub MaMacro()
Dim monRange As Range
Set monRange = Sheets("Feuil1").Range("A1")
Call Worksheet_Change(monRange)
End Sub
Si hago una macro sin modificar nada y la ejecuto, de inmediato, Excel coloca "no está bien" en B1 y luego, independientemente de lo que indique en A1, B1 no se modifica más.
Tal vez me equivoqué, pero esperaba que B1 se modificara en función del valor de A1.
¿Qué es lo que no entendí?
Además, aquí está lo que deseo hacer.
Un usuario debe hacer una elección en una lista de validación.
Una vez que se haya hecho, el programa debe continuar ejecutándose.
¿Puede decirme cómo hacer para llamar al programa después de que se haya hecho la elección?
Le agradezco de antemano por su respuesta.
Atentamente,
Henri
Configuración: Windows / Chrome 48.0.2564.116
4 respuestas
-
Hola,
Basado en la función WaitForUserInput de Chip Pearson.
Necesitas:
En un módulo estándar el código:Option Explicit Public Changee As Boolean Sub Test() Dim B As Boolean MsgBox "Debes hacer tu elección en la celda A1 Hoja1" 'aquí esperamos B = Espera_Usuario(Worksheets(1).Range("A1"), 10) 'después de la espera If B = True Then MsgBox "la celda A1 ha cambiado, contiene: " & Range("A1").Value Else MsgBox "la celda no ha cambiado" End If End Sub Public Function Espera_Usuario(Celda_Cambiada As Range, Duracion_Max As Integer) As Boolean Dim Inicio As Double Changee = False Inicio = Now Do DoEvents If Changee = True Then Espera_Usuario = True Exit Function End If Loop While Now - Inicio < TimeSerial(0, 0, Duracion_Max) Espera_Usuario = False End Function
y en el módulo de la Hoja1 (como ejemplo):Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Changee = True End Sub
--
Antes, nunca lograba terminar mis frases... pero ahora puedo -
Merci pour la réponse.
Mi problemática es ligeramente diferente, ya que debo esperar, indefinidamente si es necesario, a que el usuario tome su decisión de la lista a continuación:
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="BIACCDF ,BIACUSD ,RAWUSD ,TMBCNF ,TMBUSD "
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "Sus cuentas"
.ErrorTitle = ""
.InputMessage = "Elija una cuenta haciendo clic en la flecha"
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Una vez que se ha hecho la elección, la macro debe continuar ejecutándose.
Según su artículo, se puede llamar con un comando como
Call Module1.ListeDesPaiementsSuite
Pero mi pregunta es: ¿cómo hacer que se inicie automáticamente la continuación (llamada...) cuando la celda E1, que contiene la elección, está completada?
Gracias por su paciencia
Henri-
Es muy parecido a lo que proponía.
En el módulo de la Hoja1Private Sub Worksheet_Change(ByVal Target As Range) If Target = Cell_Cambiada Then Cambiada = True End Sub
Y en un módulo estándar:Option Explicit Public Cambiada As Boolean, Cell_Cambiada As Range Sub test() Dim B As Boolean Worksheets("Hoja1").Range("E1").Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="BIACCDF ,BIACUSD ,RAWUSD ,TMBCNF ,TMBUSD " .IgnoreBlank = True .InCellDropdown = True .InputTitle = "Tus cuentas" .ErrorTitle = "" .InputMessage = "Elige una cuenta haciendo clic en la flecha" .ErrorMessage = "" .ShowInput = True .ShowError = True End With Set Cell_Cambiada = Worksheets("Hoja1").Range("E1") B = Espera_Usuario MsgBox "valor cambiado, siguiente" End Sub Public Function Espera_Usuario() As Boolean Dim Inicio As Double Cambiada = False Inicio = Now Do DoEvents If Cambiada = True Then Espera_Usuario = True Exit Function End If Loop Espera_Usuario = False End Function
-
-
¡Muchas gracias! ¡Ya empieza a oler a establo! :-)
Siento que estamos muy cerca del gran premio, pero aún hay un pequeño detalle por resolver.
La hoja sobre la que se aplica el tratamiento se abre al principio con
On Error Resume Next
ChDrive "X:"
If Error Then
ChDrive "C:"
ChDir "C:\WinBooks\DataExcel"
Else
ChDir "X:\DataExcel"
End If
nom = Application.GetOpenFilename("Nombre archivo,*.XLS")
If nom <> False Then
Workbooks.Open nom
Else
Exit Sub
End If
On Error GoTo 0
Lo que hace que no pueda colocar de antemano lo que sigue en la hoja1
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Cell_Changeante Then Changee = True
End Sub
¿Cómo podría hacerlo entonces?
Gracias nuevamente por su rapidez.-
Option Explicit Public Cell_Changeante As Range Sub test() Dim B As Boolean, Valeur_Initiale As String Worksheets("Feuil1").Range("E1").Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="BIACCDF ,BIACUSD ,RAWUSD ,TMBCNF ,TMBUSD " .IgnoreBlank = True .InCellDropdown = True .InputTitle = "Vos comptes" .ErrorTitle = "" .InputMessage = "Choisissez un compte en cliquant sur la flèche" .ErrorMessage = "" .ShowInput = True .ShowError = True End With Set Cell_Changeante = Worksheets("Feuil1").Range("E1") Valeur_Initiale = CStr(Cell_Changeante.Value) B = Attente_Utilisateur(Valeur_Initiale) MsgBox "valeur changée, suite" End Sub Public Function Attente_Utilisateur(Valeur As String) As Boolean Do DoEvents If Cell_Changeante.Value <> Valeur Then Attente_Utilisateur = True Exit Function End If Loop Attente_Utilisateur = False End Function
-
-
¡Aleluya! ¡Funciona!
He sustituido MsgBox "valor cambiado, continuación" por el Call y ¡bingo!
¡Felicidades y gracias!
Debería dedicar absolutamente unos días a seguir cursos, ¡creo que ganaría muchísimo!
¡Otra vez gracias!
Henri