Como transcribir una fórmula excel a un código vb

Tengo la siguiente fórmula, la cual me funciona muy bien

F2&TEXTO(CONTAR.SI.CONJUNTO($E$1:E2,E2,$F$1:F2,F2),"000")

Sin embargo quisiera pasarlo a un codigo vb excel

sub loteo()

'aqui la formula convertida en macro

end sub

2 respuestas

Respuesta
3

En el video N° 15 de mi canal (Fórmulas con VBA) dejo un par de ejemplos, que también puedes copiarlos desde el Blog. En el segundo ejemplo explico cómo utilizar la grabadora de macros y luego ajustar los detalles.

Otro video del uso de la grabadora en el video N° 62 ;)

Respuesta
2

Utiliza la grabadora de macros. Edita la fórmula, presiona enter y te genera el código.

Algo como esto:

Sub Macro1()
'
' Macro1 Macro
'
'
    ActiveCell.FormulaR1C1 = _
        "=RC[-1]&TEXT(COUNTIFS(R1C5:RC[-2],RC[-2],R1C6:RC[-1],RC[-1]),""000"")"
    Range("G3").Select
End Sub

Luego puedes editar el código:

Sub loteo()
  ActiveCell.Formula = "=F2&TEXT(COUNTIFS($E$1:E2,E2,$F$1:F2,F2),""000"")"
End Sub

Y así vas a prendiendo...

Una duda, y para hacerlo pero como código VB

Osea el mismo resultado pero sin usar la fórmula

No entiendo qué quieres hacer con la fórmula.

Podrías poner 2 imágenes, una imagen con los datos originales.

Otra imagen con el resultado que tú quieres.

¿En cuál celda empiezas a poner la fórmula?

Lo que pasa es que esa fórmula la tengo de la siguiente manera

Entonces como puedes notar en el producto

"pan de muerto chico" hay un dato que dice semana, entonces en la semana 39 hay 3 lotes

Y esa fórmula me ayuda a que cuando pasemos ala semana 40

Este reinicie el lote desde 1 y ponga al inicio la semana de referencia..

Entonces actualmente lo tengo en fórmula, pero me gustaría que una macro vaya en mi código

Porque lo manejo por medio de un listbox

Pero no logro que sea consecutivo en el listobox.

En donde dice lote, me tiene que poner la veces que es elegido ese producto

Tomando en cuenta la base de datos (la imagen1)

Ejemplo ahí debe tomar de refencia la semana en este caso 39

Y si elijo 3 veces el mismo producto debería ser (esto si en mi base de datos no he seleccionado ese producto)
39001

39002

39003

En caso de que en mi base de datos tengo los mismo productos de la misma semana 39 pero anteriormente he seleccionado

39001

39002

39003

Entonces cuando yo le de clic a mi código que tengo para pasar datos al listobox

Este me reconozca en mi base de datos que de la semana 39 que hay 3 lotes

Siempre de ese producto y de esa semana y que al pasar el dato ahora en mi listbox

Este me ponga 39004,39005,39006 y así sucesivamente, esto ya lo hice si lo hago desde mi hoja excel con fórmulas pero no logro saber como pasarlo en mi código VB,

El otro detalle que se me presenta es que cuando por alguna razón al haber capturado

39004,39005,39006 y desde mi listbox elimino el 39005 este me debería actualizar el listobox

Y colocar 39004,39005 como que una actualización.. y ya cuando le de imprimir este se guarde en mi base de datos (ya cuento con el código) y los consecutivos prevalezcan, y eso con cada producto que vaya capturando, ahí en la 1era imagen esta "galleta de manteca" que tiene otro lote por las veces que he capturado

Anexo código que uso para el listobox

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim cantidad 'Nro
X:
    fila = Me.ListBox1.ListIndex
    Set h = Sheets(Hoja31.Name)
    'ListBox1.List(fila, 0)  columna B
    cantidad = InputBox("Clave: " & ListBox1.List(fila, 0) & vbCr & "Categoria: " & ListBox1.List(fila, 9) & _
    vbCr & "Descripción: " & ListBox1.List(fila, 8) & vbCr & "Si estás seguro, captura la cantidad:", _
    "Seleccionaste: " & ListBox1.List(fila, 1))
    If IsNumeric(cantidad) Then
    If Val(cantidad) > 0 Then
    'agregar el producto al pedido
    'FormPedido.ListBox1.AddItem Me.ListBox1.List(Me.ListBox1.ListIndex, 0)    ' Producto
   NOTAS.ListBox1.ColumnCount = 9
   NOTAS.ListBox1.AddItem cantidad    'Pedido
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 1) = ARTICULOS.ListBox1.List(fila, 6) ' pzas x pedido
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 2) = ARTICULOS.ListBox1.List(fila, 0) ' clave
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 3) = ARTICULOS.ListBox1.List(fila, 2) 'producto
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 4) = cantidad * ARTICULOS.ListBox1.List(fila, 6) 'cantidad
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 5) = (Date + ARTICULOS.ListBox1.List(fila, 12)) 'caducidad
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 6) = "lote"
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 7) = Format(ARTICULOS.ListBox1.List(fila, 3), "$#,##0.00") 'costo
   NOTAS.ListBox1.List(NOTAS.ListBox1.ListCount - 1, 8) = Format(ARTICULOS.ListBox1.List(fila, 3) * cantidad, "$#,##0.00") 'importe
 NOTAS.ListBox1.ColumnWidths = "80 pt;80 pt;60 pt;220 pt;80 pt;140 pt;90 pt;100"
'este cuenta cuantos listbox estan en uso
For cuenta = 0 To NOTAS.ListBox1.ListCount - 1
If NOTAS.ListBox1.List(cuenta, 0) <> "" Then
Mm = Mm + 1
End If
Next
ARTICULOS.Label18.Caption = Mm 'MsgBox "hay un total de: " & m & " datos, y serán anotados en el textbox1"
NOTAS.Label18.Caption = Mm
'este es para sumar los importes de los listbox
For i = 0 To NOTAS.ListBox1.ListCount - 1    'ajustar nbre del control ListBox
tot = Val(tot) + NOTAS.ListBox1.List(i, 8)
Next i
NOTAS.Label19.Caption = Format(Val(tot), "$#,##0.00")
ARTICULOS.Label19.Caption = Format(Val(tot), "$#,##0.00")
NOTAS.Label25.Caption = CONVERTIRNUM(NOTAS.Label19.Caption)
'Unload Me
Else
MsgBox "Número menor a 0", vbExclamation + vbOKOnly, "Atención"
GoTo X
End If
End If
End Sub

de antemano gracias

Si es necesario abrir más preguntas con gusto, saludos

Sin duda, la opción con fórmula es más simple, por ejemplo:

Sub loteo_2()
  With Range("G2:G" & Range("F" & Rows.Count).End(3).Row)
    .Formula = "=F2&TEXT(COUNTIFS($E$1:E2,E2,$F$1:F2,F2),""000"")"
    .Value = .Value
  End With
End Sub

Si quieres conservar las fórmulas, quita esta línea:

.value = .value


Te paso la macro, con matrices y el uso de Dictionary.

Hace lo mismo. En el Dictionary va haciendo un contador por producto y semana, después pasa el registro a la matriz 'b'. Al final pasa los valores a las celdas.

Sub loteo()
'Por Dante Amor
  Dim dic As Scripting.Dictionary
  Dim a As Variant, b As Variant, itm As Variant
  Dim llave As String
  Dim i As Long, y As Long, num As Long
  '
  Set dic = New Scripting.Dictionary
  a = Range("E2", Range("F" & Rows.Count).End(3)).Value
  ReDim b(1 To UBound(a, 1), 1 To 1)
  '
  For i = 1 To UBound(a, 1)
    llave = a(i, 1) & "|" & a(i, 2)
    If Not dic.Exists(llave) Then
      y = 1
      itm = a(i, 2)
      num = 1
    Else
      itm = Split(dic(llave), "|")(0)
      num = Split(dic(llave), "|")(1) + 1
    End If
    dic(llave) = itm & "|" & num
    b(i, 1) = itm & Format(num, "000")
  Next
  Range("G2").Resize(UBound(b, 1)).Value = b
End Sub

[sal u dos

Una duda... El. Código con dictionary

Se le. Puede adaptar a mi código que uso en mi listbox? O. Como. Puedo hacer eso

No sé qué quieres hacer en tu listbox.

Los códigos son para poner el lote en la hoja.

Si necesitas ayuda con otro tema, ya sabes que debes crear otra pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas