Cargar Matriz en Excel con VBA

Anónimo
2013-07-03T14:07:20+00:00

Buenas como estan,

mire tengo u gran problema en Excel con VBA tengo este codigo, y deseo simplificarlo y corregir el error de que no me carga bien la matriz en la hoja llamada General, que podre hacer, en negrita es donde esta la simplificacion y error:

Public NuevoNombre As String

Sub CopiarHojaDeArchivosEnDirectorio()

  Dim Ruta As String, Archivo As String

    Application.ScreenUpdating = False

    With ThisWorkbook

      Ruta = .Path & ""

      Archivo = Dir(Ruta & "*.xls*")

      Do While Archivo <> ""

        If Archivo = .Name Then GoTo Siguiente

        Application.StatusBar = "Procesando..." & Archivo

        Workbooks.Open Ruta & Archivo

        Worksheets(3).Copy After:=.Worksheets(.Worksheets.Count)

        CambiaNombre (Archivo)

        .Worksheets(.Worksheets.Count).Name = NuevoNombre

        For C = 3 To 49

            For A = 5 To 40

                .Worksheets(.Worksheets.Count).Activate

        '                Asigna valor de fila G + valor(A) en Dato

                Dato = Worksheets(.Worksheets.Count).Cells(A, 7).Value

                Porciento = Worksheets(.Worksheets.Count).Cells(1, 8).Value

                Programa1 = Worksheets(.Worksheets.Count).Cells(5, 2).Value                Programa2 = Worksheets(.Worksheets.Count).Cells(8, 2).Value                Programa3 = Worksheets(.Worksheets.Count).Cells(13, 2).Value                Programa4 = Worksheets(.Worksheets.Count).Cells(18, 2).Value                Programa5 = Worksheets(.Worksheets.Count).Cells(21, 2).Value                Programa6 = Worksheets(.Worksheets.Count).Cells(25, 2).Value                Programa7 = Worksheets(.Worksheets.Count).Cells(32, 2).Value                Programa8 = Worksheets(.Worksheets.Count).Cells(37, 2).Value                Programa9 = Worksheets(.Worksheets.Count).Cells(39, 2).Value                Windows("Consolida.xlsm").Activate                Worksheets(2).Cells(.Worksheets.Count, 4).Value = Programa1                Worksheets(2).Cells(.Worksheets.Count, 8).Value = Programa2                Worksheets(2).Cells(.Worksheets.Count, 14).Value = Programa3                Worksheets(2).Cells(.Worksheets.Count, 20).Value = Programa4                Worksheets(2).Cells(.Worksheets.Count, 24).Value = Programa5                Worksheets(2).Cells(.Worksheets.Count, 29).Value = Programa6                Worksheets(2).Cells(.Worksheets.Count, 38).Value = Programa7                Worksheets(2).Cells(.Worksheets.Count, 44).Value = Programa8                Worksheets(2).Cells(.Worksheets.Count, 47).Value = Programa9

B = A - 1                If Worksheets(2).Cells(C, B).Value = "" Then                    If A < 41 Then        '                    Asigna Dato en fla D + valor(C)                        Worksheets(2).Cells(C, B).Value = Dato                    Else                        B = A        '                    Asigna Dato en fla D + valor(C)                        Worksheets(2).Cells(C, B).Value = Dato                    End If                End If                Next A            A = 5        Next C

        Windows("Consolida.xlsm").Activate

        Worksheets(2).Cells(.Worksheets.Count, 2).Value = NuevoNombre

        Worksheets(2).Cells(.Worksheets.Count, 3).Value = Porciento

        Workbooks(Archivo).Close False

Siguiente:

            Archivo = Dir()

          Loop

        End With

        Application.StatusBar = "Listo"

End Sub

Public Function CambiaNombre(cadena As String) As String

Dim Posicion As Integer, Caracter As Variant

'definimos una matriz sin especificar elementos

Dim Matr() As Variant

'la redefinimos y le asignamos un número de elementos

'igual al número de caracteres que componen la cadena a evaluar

ReDim Preserve Matr(Len(cadena))

'recorremos cada uno de dichos caracteres

For Posicion = 1 To Len(cadena)

    Caracter = Mid$(cadena, Posicion, 1)

    If Caracter <> " " Then

        Matr(Posicion) = Caracter

        NuevoNombre = Join(Matr, "")

    Else

        Exit For

    End If

    Next Posicion

End Function

Microsoft 365 y Office | Excel | Para la casa | Windows

Pregunta bloqueada. Esta pregunta se migró desde la comunidad de soporte técnico de Microsoft. Puedes votar si te parece útil, pero no puedes agregar comentarios o respuestas ni seguir la pregunta.

0 comentarios No hay comentarios
Respuesta aceptada por el autor de la pregunta
Héctor Miguel 71,595 Puntos de reputación
2013-07-03T20:03:16+00:00

sube tu archivo a una carpeta pública de TU SkyDrive, obtén una ruta para su descarga y compártela en tu siguiente mensaje

de todas formas, hay algunos "conceptos" que no has analizado completamente (p.e.)

  1. lo que hace la función, ya lo "leí", le pasas como parámetro el nombre del libro que se abre y lo "recortas" en caso de encontrarse algún espacio " ", para asignarlo como nombre a la hoja recién agregada, la pregunta es: porque recortas al espacio ?

=> (no pusiste dos o tres ejemplos)

  1. Windows(... es claro que se refiere a un libro abierto, PERO... "ThisWorkbook" NO ES... ninguna hoja, es EL LIBRO donde esta pegado el código que expones, por lo que NO CAMBIA de nombre (según el bucle) a "XXXX"

nueva (RE)pregunta:

hay algún rango "especifico" para obtener los datos de la hoja(3) copiada de cada libro y agregada al libro (ThisWorkbook) ?

saludos,

hector.

p.d. agrego: cómo se llama el libro donde está el código que expones ?

¿Le resultó útil esta respuesta?

0 comentarios No hay comentarios

41 respuestas adicionales

Ordenar por: Más reciente
  1. Anónimo
    2013-07-16T16:05:22+00:00

    Muchas Gracias yo estaba con un codigo generado por el grabador de macro

    Dim strRutaArchivo As String

    strRutaArchivo = Application.GetOpenFilename

    n = 2

    If strRutaArchivo <> "" Then

        n = n + 1

        Windows("Consolida.xlsm").Activate

        Worksheets("General").Activate

        Dato = Worksheets("General").Range("b" & n).Value

        Workbooks.Open strRutaArchivo

        Cells.Find(What:=Dato, After:=ActiveCell, LookIn:= _

            xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _

            xlNext, MatchCase:=False, SearchFormat:=False).Activate

    Else

        MsgBox "Debe abrir el correcto libro de excel", vbCritical

    End If

    por ahi iba pero ya me diste mas luz igualmente eso de DD-MM-AAAA es una fecha que pondran pero ya les indique a los que utilizaran este libro que no debe poseer eso en el nombre

    Muchas Gracias.

    Salu2

    ¿Le resultó útil esta respuesta?

    0 comentarios No hay comentarios
  2. Héctor Miguel 71,595 Puntos de reputación
    2013-07-15T23:20:13+00:00

    (tu) tienes un "problema" (a futuro) con los nombres "totalmente descriptivos" (y extremadamente largos) :D :D :D

    y no has analizado (aun) ninguna de las macros como para estar en condiciones de hacer tus propias adaptaciones (?)

    como están las cosas, cambia el código de tu CommandButton2 a lo siguiente:

    (OJO con los saltos de línea si copias/pegas directamente del mensaje)...

    (y... MUCHO OJO también con el "final" del nombre del libro... => al DD MMM AAAA <= que onda con esto ?)

    Private Sub CommandButton2_Click()

      On Error Resume Next

      Tmp = Len(Workbooks("Proyecto NICSPCR - Informe de Seguimiento al Proceso Implementación.xlsx").Name)

      If Tmp = 0 Then _

        MsgBox "PRIMERO abre el libro Proyecto NICSPCR - Informe de Seguimiento al Proceso Implementación y luego ""regresa"" a esta hoja para ejecutar !!!": Exit Sub

      Dim celda As Range

      For Each celda In Worksheets(2).Range(Worksheets(2).[b3], Worksheets(2).[b3].End(xlDown))

        Workbooks("Proyecto NICSPCR - Informe de Seguimiento al Proceso Implementación.xlsx").Worksheets("seguimiento").Range("h:h") _

          .Find(Left(celda, InStr(celda, " ") - 1)).Offset(, 2) = celda.Offset(, 1)

      Next

    End Sub

    saludos,

    hector.

    ¿Le resultó útil esta respuesta?

    0 comentarios No hay comentarios
  3. Anónimo
    2013-07-15T21:00:46+00:00

    Disculpa hector ya coloque los archivos correctos por favor verificar denuevo

    ¿Le resultó útil esta respuesta?

    0 comentarios No hay comentarios
  4. Héctor Miguel 71,595 Puntos de reputación
    2013-07-15T19:49:50+00:00

    (según parece) no se está dando una comunicación "efectiva" entre nosotros (?), p.e. en los nuevos archivos...

    1) NO hay macros ni datos en la hoja de consolidación (?)

    1. No se trata de la columna "siguiente" (hay una columna mas de por medio)
    2. hay mas... omito entrar en mas detales

    ahora que, si se trata de "hacerle al adivino" (espero no errar, o al menos, no "por mucho") :D

    cambia la macro sugerida anteriormente por esto:

    (OJO: no te olvides de cambiar las "xx" por el nombre REAL de tu segundo libro)

    (OJO: tampoco previene errores por si alguna municipalidad/institución no se encuentra en "xx")

    Sub Copia_porcentajes()

      On Error Resume Next

      Tmp = Len(Workbooks("xx").Name)

      If Tmp = 0 Then _

        MsgBox "PRIMERO abre el libro XX y luego ""regresa"" a esta hoja para ejecutar !!!": Exit Sub

      Dim celda As Range

      For Each celda In Range([b3], [b3].End(xlDown))

        Workbooks("xx").Worksheets("seguimiento").Range("h:h") _

          .Find(celda).Offset(, 2) = celda.Offset(, 1)

      Next

    End Sub

    saludos,

    hector.

    ¿Le resultó útil esta respuesta?

    0 comentarios No hay comentarios