Datos de 2 TXT a XLS

Hola:
Necesito terminar lo siguiente:
Estoy haciendo una macro que me inserta en cada hoja de Excel dependiendo del primer string del txt. Esto lo hace perfecto.
Lo que trato de hacer ahora es tener otro TXT con la posición inicial de CADA hoja.
En mi macro leo los 2 TXT y al comparar los 2 nombres de las hojas se me genera mi confusión. Tengo esto: If parametros(0) = nomhoja Then  , PERO en vez  de "nomhoja", debe ser  el string 'sHoja' que contiene todas los nombre de las hojas del PRIMER TXT
parametros.txt
Prioritarios GENERAL LENG (tecla tab)   C5
GENERAL LENG (tecla tab)  F7 
__
En el método LlenaLinea están los for que recorren las 2 matrices que contienen los datos
macro:
Dim sUltimaHoja As String
Dim CntFilas As Integer
Sub Llenar()
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim sRuta As String
    Dim sLinea As String
    Dim sHoja() As String
    sRuta = ActiveWorkbook.Path
    Set archivo = fso.OpenTextFile(sRuta + "/datostab.txt", 1)
    Do While Not archivo.AtEndOfStream
        sLinea = archivo.readline()
        sHoja = Split(sLinea, vbTab)
        If UCase(sUltimaHoja) <> UCase(sHoja(0)) Then
            If Trim(sUltimaHoja) <> "" Then
                'For i = 1 To 8
                    'Suma CntFilas + 1, i, 2
                'Next
            End If
            sUltimaHoja = sHoja(0)
            CntFilas = 0
        Else
            CntFilas = 0 + 1
        End If
            If Not SheetExist(sUltimaHoja) Then
            Sheets.Add
            ActiveSheet.Name = sUltimaHoja
        End If
        'txt parametros
            Set fso1 = CreateObject("Scripting.FileSystemObject")
    Dim sRutaP As String
    Dim sLineaParametros As String
    Dim sHojaParam() As String
    sRutaP = ActiveWorkbook.Path
    Set archivoparam = fso1.OpenTextFile(sRutaP + "/parametros.txt", 1)
    Do While Not archivoparam.AtEndOfStream
        sLineaParametros = archivoparam.readline()
        sHojaParam = Split(sLineaParametros, vbTab)
        If UCase(sUltimaHojaP) <> UCase(sHojaParam(0)) Then
            If Trim(sUltimaHoja) <> "" Then
                'nn
            End If
            sUltimaHojaP = sHojaParam(0)
            'CntFilas = 0
        Else
            'CntFilas = 0 + 1
        End If
    'lee sLineaParametros, sUltimaHojaP
    Loop
   ' archivoparam.Close
        LlenaLinea sUltimaHoja, sLinea, CntFilas, sLineaParametros, sUltimaHojaP
    Loop
    'Para la última hoja
    'For i = 1 To 8
        'Suma CntFilas + 1, i, 2
    'Next
    Archivo.Close
archivoparam.Close
    'MsgBox "Importado"
End Sub
Sub LlenaLinea(ByVal sHoja As String, ByVal sLinea As String, ByVal nFila As Double, ByVal sLineaParametros As String, ByVal nomhoja As String)
    Dim columna As Double
    Dim ifila As Integer
    columna = 0
    Sheets(sHoja).Select
     parametros = Split(sLineaParametros, vbTab)
     b = Split(sLinea, vbTab)
'MsgBox (parametros(0))
    If parametros(0) = nomhoja Then
    For i = 1 To UBound(parametros)
    columnaletra = Mid(parametros(1), 1, 1)
    columna = LetraANumero(columnaletra)
    ifila = Mid(parametros(1), 2, 1)
For j = 1 To UBound(b)
    If (IsNumeric(b(j))) Then
        Dim totColumna As Integer
        totColumna = columna + j
        Cells(nFila + ifila, columna + j) = CDbl(b(j))
        Cells(nFila + ifila, columna + j).Interior.ColorIndex = 6
        Else
        Cells(nFila + ifila, columna + j) = b(j)
        Cells(nFila + ifila, columna + j).Interior.ColorIndex = 6
        End If
      'Para diseñar celdas
        Dim vaColumna As Integer
        vaColumna = columna + j
       Dim vaFila As Integer
       vaFila = nFila + ifila
    Range(Cells(vaFila, vaColumna), Cells(vaFila, vaColumna)).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
       ...

1 Respuesta

Respuesta
1
Hocontreras:
Para poder ayudarte mejor, dame un ejemplo de lo que debería dar como resultado, partiendo de un determinado contenido del achivo datostab.txt.
¿El segundo txt lo estas utilizando como auxiliar o es estrictamente necesario? ¿Cuál es su función?
¿Lo qué pretendes es que cada linea del achivo datostab.txt se copie a la última fila desocupada de la hoja indicada por el primer dato de la línea?
¿Cómo sabes en qué columna comienza a escribirse en cada hoja?
---- Por mientras, algunas cosillas que te pueden servir
Para verificar la existencia de una hoja
If LA_HOJA Is Nothing then 'Si LA_HOJA no existe, esto dará verdadero
Obtener la última fila ocupada de la columna F (por ejemplo)
Range("F65536").End(xlUp).Row
El Rango A1:B2 (por ejemplo) Se podría referenciar de distintas formas
1. Range("A1:B2")
2. Range("A1","B2")
3. Range(Cells(1, 1), Cells(2, 2))
El Celda A1 (por ejemplo) Se podría referenciar, también, de distintas formas
1. Cells(1, 1)
2. Range("A1")
----------------------------------
Espero tu respuesta y espero que estas cosillas te ayuden a limpiar un poco el código.
Ya no hace falta,
Gracias de todas maneras.
El tema era de que el TXT auxiliar es para indicar a qué posición se debe insertar cada fila.
Saludos
Ahora necesito hacer una función dinámica para esto:
Estás funciones me sirven, pero quiero que en forma dinámica se vaya creando el Case y la Letra, sabiendo que son las letras de las celdas de una planilla excel.
Function NumeroALetra(ByVal Numeri As Integer) As String
    Select Case Numeri
        Case 1
            NumeroALetra = "A"
        Case 2
            NumeroALetra = "B"
        Case 3
            NumeroALetra = "C"
        Case 4
            NumeroALetra = "D"
        Case 5
            NumeroALetra = "E"
        Case 6
            NumeroALetra = "F"
        Case 7
            NumeroALetra = "G"
        Case 8
            NumeroALetra = "H"
        Case 9
            NumeroALetra = "I"
        Case 10
            NumeroALetra = "J"
            'etc....
    End Select
Lo mismo, pero al revés.
End Function
Function LetraANumero(ByVal letra As String) As Integer
    Select Case letra
        Case "A"
            LetraANumero = 1
        Case "B"
             LetraANumero = 2
        Case "C"
             LetraANumero = 3
        Case "D"
             LetraANumero = 4
        Case "E"
             LetraANumero = 5
        Case "F"
             LetraANumero = 6
        Case "G"
             LetraANumero = 7
        Case "H"
             LetraANumero = 8
        Case "I"
             LetraANumero = 9
        Case "J"
          LetraANumero = 10
               Case "K"
          LetraANumero = 11
               Case "L"
          LetraANumero = 12
               Case "M"
          LetraANumero = 13
               Case "Ñ"
          LetraANumero = 14
            'etc....
    End Select
End Function
Gracias!
¿Para qué quieres esas macros?
De todas formas aquí te las dejo. Espero te sirvan
Saludos!
'Acepta cualquier número mayor que cero, con uno menor o igual a cero, envia vacio
Function NumeroALetra(ByVal Numeri As Integer) As String
    Dim strBase() As String
    Dim strCol As String
    strBase = Split("A B C D E F G H I J " & _
                    "K L M N O P Q R S T " & _
                    "U V W X Y Z")
    Do Until (Numeri <= 0)
        Numeri = Numeri - 1
        strCol = strBase((Numeri Mod 26)) & strCol
        Numeri = Numeri \ 26
    Loop
    NumeroALetra = strCol
End Function

'Acepta cualquier letra o combinacion de letras (desde A a Z)
Function LetraANumero(ByVal letra As String) As Integer
    Dim i as Integer
    Dim intLargo As Integer
    Dim intPaso As Integer
    Dim varCifra As Variant
    Dim strDom As String
    strDom = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LetraANumero = 0
    intLargo = Len(letra)
    For i = 1 To intLargo
       varCifra = UCase(Mid(letra, i, 1))
       LetraANumero = LetraANumero + InStr(1, strDom, varCifra) * 26 ^ (intLargo - i)
    Next
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas