[Excel vba] Problema de asignación de macro -> objeto
Resuelto
xjl
Mensajes publicados
232
Estado
Miembro
-
Usuario anónimo -
Usuario anónimo -
Hola,
tengo un pequeño problema de asignación:
N = Right(Cells(ligne, 2).Value, 3)
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "SELECCIÓN_TRONCÓN(N)"
El depurador me da un error 1004: Esta fórmula es demasiado complicada para ser asignada a un objeto
De hecho tengo una macro que debe asignar otra macro (SELECCIÓN_TRONCÓN(N)) a un objeto en función del número de tramo contenido al final de la celda (ligne,2).
¿Alguien sabría cómo puedo modificar la sintaxis para que funcione por favor?
Gracias de antemano
tengo un pequeño problema de asignación:
N = Right(Cells(ligne, 2).Value, 3)
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "SELECCIÓN_TRONCÓN(N)"
El depurador me da un error 1004: Esta fórmula es demasiado complicada para ser asignada a un objeto
De hecho tengo una macro que debe asignar otra macro (SELECCIÓN_TRONCÓN(N)) a un objeto en función del número de tramo contenido al final de la celda (ligne,2).
¿Alguien sabría cómo puedo modificar la sintaxis para que funcione por favor?
Gracias de antemano
Configuración: Windows XP Internet Explorer 6.0
6 respuestas
Hola,
¡una historia de sintaxis!
la línea:
Sheets(Cells(fila, 1).Value).Shapes(Cells(fila, 2).Value).OnAction = "SELECTION_TRONCON(N)"
debería leerse:
Sheets(Cells(fila, 1).Value).Shapes(Cells(fila, 2).Value).OnAction = "'SELECTION_TRONCON" & "(" & """" & N & """" & ")'"
aquí hay un ejemplo funcional en mi rutina:
'Creación de la cadena de comando para la propiedad VBA <.OnAction>
CadenaComando = "'CreationPageBarreOutils " & "(" & """" & NumPage & """" & ")'"
'Asignación de la cadena de comando a la propiedad VBA <.OnAction>
Application.CommandBars("Bloc").Controls(Bucle).OnAction = CadenaComando
¡Buena suerte!
Lupin.
¡una historia de sintaxis!
la línea:
Sheets(Cells(fila, 1).Value).Shapes(Cells(fila, 2).Value).OnAction = "SELECTION_TRONCON(N)"
debería leerse:
Sheets(Cells(fila, 1).Value).Shapes(Cells(fila, 2).Value).OnAction = "'SELECTION_TRONCON" & "(" & """" & N & """" & ")'"
aquí hay un ejemplo funcional en mi rutina:
'Creación de la cadena de comando para la propiedad VBA <.OnAction>
CadenaComando = "'CreationPageBarreOutils " & "(" & """" & NumPage & """" & ")'"
'Asignación de la cadena de comando a la propiedad VBA <.OnAction>
Application.CommandBars("Bloc").Controls(Bucle).OnAction = CadenaComando
¡Buena suerte!
Lupin.
Hola xlj,
pienso que podrías usar en tu macro el método Select Case para determinar los casos (valor fila, 2). Según estos valores llamarías a la macro correspondiente con el método Call + nombre de la macro.
cordialmente
seb
¡hasta luego!
pienso que podrías usar en tu macro el método Select Case para determinar los casos (valor fila, 2). Según estos valores llamarías a la macro correspondiente con el método Call + nombre de la macro.
cordialmente
seb
¡hasta luego!
De hecho, es posible, el único problema es que mi macro asigna una macro a formas, y tengo algunas cientos, es decir, si utilizo este método, necesitaré una macro por forma, mientras que quiero asignar la misma macro a todas las formas que tomaría como variable el final del nombre de la forma... ¿No sé si está muy claro?
¡Gracias de todos modos y cualquier nueva idea será bienvenida! ;-)
¡Gracias de todos modos y cualquier nueva idea será bienvenida! ;-)
Hola,
creo que he entendido en parte tu problema. He hecho un ejemplo que quizás te sirva. Tarda 2 minutos en realizarse.
1) En una hoja de Excel, dibuja 2 rectángulos. En la esquina superior izquierda, tendrás Rectángulo 1, y Rectángulo 2 en la barra de nombres al lado de la barra de texto.
2) En tu celda A1, escribe 1
3) crea la siguiente macro:
Sub seleccionaretangulo ()
A = Cells(1, 1).value
ActiveSheet.Shapes("Rectángulo " & A).Select
End Sub
4) Ejecuta tu macro. Si tu celda A1 contiene el valor 1, tu Rectángulo 1 será seleccionado, si contiene el valor 2, tu Rectángulo 2 será seleccionado.
Solo es una idea, espero que te ayude. Mantenme informado.
creo que he entendido en parte tu problema. He hecho un ejemplo que quizás te sirva. Tarda 2 minutos en realizarse.
1) En una hoja de Excel, dibuja 2 rectángulos. En la esquina superior izquierda, tendrás Rectángulo 1, y Rectángulo 2 en la barra de nombres al lado de la barra de texto.
2) En tu celda A1, escribe 1
3) crea la siguiente macro:
Sub seleccionaretangulo ()
A = Cells(1, 1).value
ActiveSheet.Shapes("Rectángulo " & A).Select
End Sub
4) Ejecuta tu macro. Si tu celda A1 contiene el valor 1, tu Rectángulo 1 será seleccionado, si contiene el valor 2, tu Rectángulo 2 será seleccionado.
Solo es una idea, espero que te ayude. Mantenme informado.
Gracias, pero no se ajusta realmente a lo que necesito.
Necesitaría que en el OnAction de mis formas tuviera la misma macro, y que esta macro fuera capaz de detectar el nombre de la forma que fue clicada (con algo como ActiveShape.Name, pero no funciona) para asignar el número del tramo al parámetro N y luego ejecutar la macro SELECCIÓN_TRAMO(N).
De hecho, el principal problema es que no conozco la sintaxis que puede devolverme el nombre de la forma que fue clicada, ¡lo demás será fácil!
Gracias de antemano por sus ideas.
Necesitaría que en el OnAction de mis formas tuviera la misma macro, y que esta macro fuera capaz de detectar el nombre de la forma que fue clicada (con algo como ActiveShape.Name, pero no funciona) para asignar el número del tramo al parámetro N y luego ejecutar la macro SELECCIÓN_TRAMO(N).
De hecho, el principal problema es que no conozco la sintaxis que puede devolverme el nombre de la forma que fue clicada, ¡lo demás será fácil!
Gracias de antemano por sus ideas.
Hola xlj, finalmente entendí lo que querías, he hecho pruebas y en mi casa funciona. De hecho, el error 1004 es generado por la variable (N) de tu Macro SELECTION_TRONCON porque el OnAction solo acepta texto entre comillas.
Entonces intenté las siguientes modificaciones:
1) Declara tu variable N como Pública (Public N >>> todo arriba)
2) para el OnAction, reemplaza "SELECTION_TRONCON(N)" por "ShapeClick"
3) crea una macro intermedia llamada ShapeClick así:
Sub ShapeClick()
N = Right(Cells(ligne, 2).Value, 3)
Call SELECTION_TRONCON(N)
End Sub
para verificar, agrega temporalmente esta línea en tu macro SELECTION_TRONCON(N):
j = Worksheets(1).Shape(N).Name 'adapta a tu código si es necesario
msgbox j
Contáctame si hay algún problema, te puedo asegurar que cuando hago clic en un shape, me devuelve su nombre.
a+ seb
Entonces intenté las siguientes modificaciones:
1) Declara tu variable N como Pública (Public N >>> todo arriba)
2) para el OnAction, reemplaza "SELECTION_TRONCON(N)" por "ShapeClick"
3) crea una macro intermedia llamada ShapeClick así:
Sub ShapeClick()
N = Right(Cells(ligne, 2).Value, 3)
Call SELECTION_TRONCON(N)
End Sub
para verificar, agrega temporalmente esta línea en tu macro SELECTION_TRONCON(N):
j = Worksheets(1).Shape(N).Name 'adapta a tu código si es necesario
msgbox j
Contáctame si hay algún problema, te puedo asegurar que cuando hago clic en un shape, me devuelve su nombre.
a+ seb
Hola,
ya he probado algo equivalente, pero el único problema es que la variable línea no se incrementa aquí, por lo que la celda en la que buscaremos el nombre de la forma que se acaba de clicar no tendrá nada que ver con esta forma.
Veo cómo lanzar una macro a partir del clic en una de las formas, pero me parece más complicado recuperar el nombre de la forma que acaba de iniciar la macro...
¡Gracias por tus esfuerzos!
ya he probado algo equivalente, pero el único problema es que la variable línea no se incrementa aquí, por lo que la celda en la que buscaremos el nombre de la forma que se acaba de clicar no tendrá nada que ver con esta forma.
Veo cómo lanzar una macro a partir del clic en una de las formas, pero me parece más complicado recuperar el nombre de la forma que acaba de iniciar la macro...
¡Gracias por tus esfuerzos!
Hola,
todavía no he encontrado una solución a este problema, así que si alguien tiene alguna idea, estoy interesado...
¡Gracias de antemano! ;-)
todavía no he encontrado una solución a este problema, así que si alguien tiene alguna idea, estoy interesado...
¡Gracias de antemano! ;-)
Tenía el mismo problema que tú, xjl, y acabo de encontrar la solución en este momento:
Desde cada una de tus formas, solo tienes que llamar a la misma macro, sin parámetros.
Luego, en esta macro puedes recuperar la identidad de la forma que llama gracias a la variable "Application.Caller".
Si la propiedad Name de tus formas está bien configurada, deberías poder llamar a la macro parametrizada correcta a partir de eso.
Buena suerte, esperando que esto te desbloquee como lo hizo por mí.
--
Chriskang
Desde cada una de tus formas, solo tienes que llamar a la misma macro, sin parámetros.
Luego, en esta macro puedes recuperar la identidad de la forma que llama gracias a la variable "Application.Caller".
Si la propiedad Name de tus formas está bien configurada, deberías poder llamar a la macro parametrizada correcta a partir de eso.
Buena suerte, esperando que esto te desbloquee como lo hizo por mí.
--
Chriskang
Quisiera hacer lo mismo con 2 parámetros pero no funciona. No entiendo muy bien por qué. Funciona con 1 pero no con 2. ¿Es posible? ¿Podrías escribirme la cadena de comando por favor? Debo confesarte que estoy un poco perdido con todas estas comillas. Cualquier explicación adicional es bienvenida :-)
Gracias de antemano
Aquí está, la cadena de comando debería parecerse a esto:
Sub Test() Dim Chaine As String Dim N As Long, J As Long N = 2: J = 5 Chaine = "'SELECCIÓN_TRONCO" & "(" & N & "," & J & ")'" MsgBox Chaine End Sub 'El nombre de la función, parámetros incluidos, debe estar primero entre comillas simples (quote)
y todo entre comillas dobles.
Por eso la sintaxis comienza así:
Chaine = " ' SE...
Lupin
Tu solución funciona bien con la instrucción MsgBox pero cuando intento asignar la cadena a un botón a través de .OnAction no funciona y obtengo "No se puede encontrar la macro". Imagino que hay que añadir series de comillas """""" en algún lugar, pero no sé dónde.
Aquí está el código:
Sub ...
H As Integer
W As Integer
...
.OnAction='"afectemacro" & "(" & H & "," & W & ")'"
end sub
No sé qué más hacer para lograrlo. Gracias por tu ayuda.
¿La macro que llamas [ affectemacro ] está en otro módulo?
¿Está esta macro declarada como [ Private ]?
Si no, deberías pegar la instrucción completa para que pueda
hacerla funcionar. Descubrí esta sintaxis en mi libro hace
algunos años, pero solo utilizaba un argumento.
Dado que una función o rutina pueden tener más de un
argumento, está claro que esto debería funcionar.
Lupin
Tengo una macro que realiza diferentes cálculos a partir de un rango de datos (Range) y un entero.
Debo, a través de un botón, poder duplicar la tabla que contiene los datos y agregar para cada nueva ocurrencia un botón para poder ejecutar la macro anterior (cálculos).
Aquí está el código en cuestión
La macro calcular
Public Sub compute_delivery(my_cells As Range, market As Integer)
Dim...
Ligne1= Ligne2+1 'fórmulas en realidad más complicadas en realidad
Ligne2= LIgne3*1/2
...
End Sub
La parte de agregar un botón (parte delicada):
Sub Add_button_w_macro(PositionCell As Range, Txt As String, Data_macro As Range)
Const H As Integer = 51
Const W As Integer = 100
'
'
With ActiveSheet.Shapes.AddShape(msoShapeActionButtonCustom, PositionCell.Left + 6, PositionCell.Top + PositionCell.Height + 6, W, H)
With .Fill
.ForeColor.RGB = RGB(37, 64, 97)
.TwoColorGradient msoGradientHorizontal, 1
End With
With .TextFrame
.MarginBottom = 5
.MarginLeft = 5
.MarginRight = 5
.MarginTop = 5
.Characters.Text = Txt
'"Haz clic aquí para" & Chr(10) & "realizar el cronograma" & Chr(10) & " -MPR- "
.Characters.Font.Color = RGB(0, 0, 0)
.Characters.Font.Bold = True
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
End With
.OnAction = "'compute_delivery " & "(" & """ & Data_macro & """" & ")'" 'funciona bien con un parámetro
.OnAction = "'compute_delivery (""Data_macro"",""1"")'" 'no funciona con un segundo
End With
End Sub