Excel - Informe total de productos

 
Vista:
sin imagen de perfil

Informe total de productos

Publicado por Paulo (4 intervenciones) el 01/05/2015 21:13:45
Hola amigos del foro, los saludo con gusto. Quisiera pedirles un poco de ayuda con un código para crear un informe total de productos pero aún no logro que funcione.

No logro resolver esta rutina que me tiene un poco loco. Les explico, el libro contiene movimientos de entrada y salida de material y lo que pretendo lograr con la macro es que a partir de la hoja de entradas y salidas se genere una hoja de informe total de movimientos que contaría de toda la información por código ( saldo inicial, todas las entradas, todas las salidas), es decir la información total por cada uno de los códigos dentro de una hoja.

He tratado varias formas pero de ninguna logro lo esperado, un amigo me ha estado ayudando con la macro, de hecho el me ha orientado muchísimo, pero aún así lo logro hacerlo correctamente. Espero me puedan dar una idea, muchas gracias.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
Option Explicit
Private Sub CommandButton1_Click()
Sheets("Reporte").Range("a1:l10000") = ""
 
With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
 
    For I = 0 To ListBox1.ListCount - 1 'Bucle que recorre losa datos de la lista
        Dato = ListBox1.Column(0, I) 'Dichos datos son guardados en la variable "Dato"
        Saldos 'Se invooca el procedimiento "Saldos"
        Kardex
    Next
 
    With Hoja4
        .Activate
        .Visible = xlSheetVisible
        .Select
        .Columns("A:Z").AutoFit
    End With
Unload Me
End Sub
Private Sub CommandButton2_Click()
    Unload Me
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not IsNumeric(Chr(KeyAscii)) Then
    MsgBox "Debe ser numero", vbExclamation, "Atencion"
    KeyAscii = 0
End If
Largo_Entrada = Len(Me.TextBox1)
    Select Case Largo_Entrada
        Case 2
            Me.TextBox1.Value = Me.TextBox1.Value & "/"
        Case 5
            Me.TextBox1.Value = Me.TextBox1.Value & "/"
    End Select
 
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not IsNumeric(Chr(KeyAscii)) Then
    MsgBox "Debe ser numero", vbExclamation, "Atencion"
    KeyAscii = 0
End If
Largo_Entrada = Len(Me.TextBox2)
    Select Case Largo_Entrada
        Case 2
            Me.TextBox2.Value = Me.TextBox2.Value & "/"
        Case 5
            Me.TextBox2.Value = Me.TextBox2.Value & "/"
    End Select
 
End Sub
Private Sub UserForm_Initialize()
    Listado
    'Hoja2.Visible = xlSheetHidden
    Hoja1.Select
 
    TABLA
 
End Sub
Sub Listado() '<========
'Mostrar valores unicos em ListBox
Dim Rng As Range, Dn As Range
Dim Dic As Object
Hoja3.Activate
 
Set Rng = Hoja3.Range(Range("a2"), Range("a" & Rows.Count).End(xlUp))
    Set Dic = CreateObject("scripting.dictionary")
        Dic.CompareMode = vbTextCompare
            For Each Dn In Rng: Dic(Dn.Value) = Empty: Next
With ListBox1
    .RowSource = ""
    .List = Application.Transpose(Dic.keys)
End With
End Sub
Sub Saldos()
Dim SaldoI As Integer
Dim CantidadE As Integer
Dim CantidadS As Integer
Dim CostoSS As Integer
Dim CostoEn As Integer
Dim CostoSa As Integer
 
SaldoI = 0
CantidadE = 0
CantidadS = 0
CostoSS = 0
CostoEn = 0
CostoSa = 0
 
Application.ScreenUpdating = False
 
A = 11
    Do While Hoja6.Cells(A, 1) <> ""
 
'''''''''''''''''''''''''''''''''''''
 
    If Hoja6.Cells(A, 1) = Dato And CDate(Hoja6.Cells(A, 7)) >= CDate(TextBox1) And Hoja6.Cells(A, 7) <= CDate(TextBox2) Then
 
            If Hoja6.Cells(A, 13) = "Saldo Inicial" Then 'Suma los Saldos Iniciales
                SaldoI = SaldoI + Hoja6.Cells(A, 5) 'cantidades
                CostoSS = CostoSS + Hoja6.Cells(A, 12) 'costo unitario
            End If
 
            If Hoja6.Cells(A, 13) = "Entrada" Then
               CantidadE = CantidadE + Hoja6.Cells(A, 5) 'Suma las Entradas
               CostoEn = CostoEn + Hoja6.Cells(A, 12)
            End If
 
    End If
 
A = A + 1
Loop
 
''''''''''''''''''''''''''''''''''''''
 
B = 11
    Do While Hoja7.Cells(B, 1) <> ""
 
    If Hoja7.Cells(B, 1) = Dato And CDate(Hoja7.Cells(B, 7)) >= CDate(TextBox1) And Hoja6.Cells(A, 7) >= CDate(TextBox1) And Hoja6.Cells(A, 7) <= CDate(TextBox2) Then
        If Hoja7.Cells(B, 16) = "Salida" Then 'Suma las Salidas
            CantidadS = CantidadS + Hoja7.Cells(B, 5)
            CostoSa = CostoSa + Hoja7.Cells(B, 15)
        End If
    End If
 
B = B + 1
Loop
 
Application.ScreenUpdating = True
'MsgBox Dato & " " & (SaldoI + CantidadE) - CantidadS
End Sub
Sub Kardex()
Application.ScreenUpdating = False
With Hoja4
 
Uf = .Range("A" & Rows.Count).End(xlUp).Row + 7
 
 
    'Titulos de cada uno de los datos
     .Range("A" & Uf - 3) = "Codigo"
     .Range("B" & Uf - 3) = Dato
     .Range(("A" & Uf - 3), .Range("B" & Uf - 3)).Interior.Color = vbYellow 'Fondo Amarillo para los codigos
     .Range("A" & Uf - 2) = "Control"
     .Range("B" & Uf - 2) = "Fecha"
     .Range("C" & Uf - 2) = "Tipo Movimiento"
    'Entradas
     .Range("D" & Uf - 2) = "Cantidad"
     .Range("D" & Uf - 3) = "Entradas"
     .Range("E" & Uf - 2) = "Costo"
     .Range("F" & Uf - 2) = "Total"
     'Salidas
     .Range("G" & Uf - 2) = "Cantidad"
     .Range("G" & Uf - 3) = "Salidas"
     .Range("H" & Uf - 2) = "Costo"
     .Range("I" & Uf - 2) = "Total"
     'Saldos
     .Range("J" & Uf - 2) = "Saldo"
     .Range("K" & Uf - 2) = "Costo"
     .Range("L" & Uf - 2) = "Total"
 
    .Range(("A" & Uf - 2), .Range("L" & Uf - 2)).Interior.Color = vbYellow 'Fondo Amarillo para los titulos
 
 
'Este se emplea para el inicio del saldo de acuerdo a la fecha de la consulta
    .Range("C" & Uf - 1) = "Saldo Inicial"
    .Range("J" & Uf - 1) = Saldo 'De la variable contenida del saldo (saldo Inicial+Entradas-Salidas)
        If Saldo > 0 Then
        .Range("K" & Uf - 1) = CCur(CostoSS / Saldo) 'de la variable contenida del costo
        Else
        .Range("K" & Uf - 1) = 0
        End If
 
    .Range("L" & Uf - 1) = CCur(CostoSS) '* CostoSS 'Saldo por el Costo
 
'hoja-fila
 
A = 11
    Do While Hoja6.Cells(A, 1) <> ""
 
    If Hoja6.Cells(A, 1) = Dato And Hoja6.Cells(A, 13) <> "Saldo Inicial" And Hoja6.Cells(A, 7) >= CDate(TextBox1) And Hoja6.Cells(A, 7) <= CDate(TextBox2) Then
 
        .Range("A" & Uf) = Hoja6.Cells(A, 1) 'columna código
        .Range("B" & Uf) = CDate(Hoja6.Cells(A, 7)) 'columna fecha
       ' .Range("C" & Uf) = Hoja2.Cells(A, 13) 'columna término
 
            If Hoja6.Cells(A, 13) = "Entrada" Then
                Hoja4.Range("D" & Uf) = Hoja6.Cells(A, 5) 'columna cantidad
                Hoja4.Range("E" & Uf) = CCur(Hoja6.Cells(A, 12))
                Hoja4.Range("F" & Uf) = CCur(Hoja4.Range("D" & Uf) * Hoja4.Range("E" & Uf))
            End If
 
            If Hoja7.Cells(A, 16) = "Salida" Then  ' hoja salidas
               Hoja4.Range("G" & Uf) = Hoja7.Cells(A, 5)
               Hoja4.Range("H" & Uf) = CCur(Hoja7.Cells(A, 15))
               Hoja4.Range("I" & Uf) = CCur(Hoja4.Range("G" & Uf) * Hoja4.Range("H" & Uf))
            End If
 
 
            'Nuevo Saldo de las Cantidades
            .Range("J" & Uf) = (.Range("J" & Uf - 1) + .Range("D" & Uf)) - .Range("G" & Uf)
 
            'Total Costo de acuerdo al nuevo saldo
            .Range("L" & Uf) = CCur(.Range("L" & Uf - 1) + .Range("F" & Uf) - .Range("I" & Uf))
            If .Range("L" & Uf) > 0 Then
            .Range("K" & Uf) = CCur(.Range("L" & Uf) / .Range("J" & Uf))
            End If
 
        'Si tenemos salidas, pues se muestra el nuevo costo promedio y se multiplica por dicha cantidad saliente
           If .Range("G" & Uf) > 0 Then
                .Range("H" & Uf) = CCur(.Range("K" & Uf - 1))
                .Range("I" & Uf) = CCur(.Range("G" & Uf) * .Range("H" & Uf))
           End If
 
        'En vista de que existe salidas, repetiremos la accion de sumar el costo+el nuevo costo - el costo promedio
            .Range("L" & Uf) = CCur(.Range("L" & Uf - 1) + .Range("F" & Uf) - .Range("I" & Uf))
            If .Range("L" & Uf) > 0 Then
                .Range("K" & Uf) = CCur(.Range("L" & Uf) / .Range("J" & Uf))
            End If
        Uf = Uf + 1
    End If
 
        A = A + 1
        Loop
 
End With
 
Application.ScreenUpdating = True
 
End Sub
 
Sub TABLA()
ListBox1.ColumnCount = 2
 
ListBox1.ColumnHeads = True
 
ListBox1.RowSource = "Tabla1"
ListBox1.ColumnWidths = "55 pt;60 pt"
 
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
Imágen de perfil de Nolberto
Val: 84
Ha aumentado su posición en 6 puestos en Excel (en relación al último mes)
Gráfica de Excel

Informe total de productos

Publicado por Nolberto (121 intervenciones) el 02/05/2015 19:17:53
Saludos.

Cuando dices "informe total" te refieres a que deseas obtener el acumulado de entradas y salidas de cada producto para obtener su existencia...?

Es importante que este claro el objetivo.

Si lo que deseas es obtener la existencia de cada producto, probablemente no valga la pena una macro con tanto código, lo puedes hacer fácilmente con formulas como se muestra en el ejemplo de esta pagina.

http://formulasexcel.com/curso-de-excel-formula-para-calcular-existencias/

En ese ejemplo se usa la función SUMAPRODUCTO que es muy potente para estos casos, también hay un vídeo donde se explica todo el proceso.

suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Informe total de productos

Publicado por Paulo (4 intervenciones) el 02/05/2015 23:27:51
Hola Nolberto, antes que otra cosa muchas gracias por contestar. Respondiendo a tu comentario, no me es adecuado realizarlo con formulas sino con programación, ya que mis existencias serán variables, y por lo tanto el finforme no tendía las mismas filas, entonces con la macro eso se puede resolver, además de que realmente lo necesito con programación. Te dejo el archivo para que veas lo que tengo pensado. Lo malo es que no me legra quedar.

Nuevamente muchas gracias.



https://onedrive.live.com/redir?resid=da5587c9508bd4f0%21260
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Informe total de productos

Publicado por Paulo (4 intervenciones) el 09/05/2015 06:46:18
Alguien que me pueda ayudar?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar