Incluir campos en una macro que crea una plantilla
Existe un archivo de Excel que tiene n numero de columnas. Adicional a eso tiene una macro que lo que hace es exportar esa información a un archivo nuevo.
La exportación copia dichos datos, crea una hoja y los pega.
El problema que tengo es que no cree esa macro y hay otras columnas nuevas que hay que pegar en la última posición.
Cual sería la función para incluir esas nuevas columnas si son:
Columna 1 se llama: año
Columna 2 se llama: concepto
Estas dos columnas deben insertarse al final y traer todos los campos que contengan datos, hay que tener en cuenta que habrán campos vacíos (No deben exportarse espacios en blanco) .
H o l a:
Puedes poner la macro para actualizarla.
Dime cuáles columnas son las que se deben incluir, es decir, dime la letra de la columna.
Esto no lo entiendo, "No deben exportarse espacios en blanco" me lo puedes explicar con ejemplos.
No me comentaste sobre esto:
Dime cuáles columnas son las que se deben incluir, es decir, dime la letra de la columna.
Esto no lo entiendo, "No deben exportarse espacios en blanco" me lo puedes explicar con ejemplos.
Hola,
El tema es así:
Un rango de filas de (Z4:AD4) contienen datos, se requiere que esa información se pegue en una columna llamada concepto (Convertir esa fila de rango en columna), como es una plantilla tanto en los rangos hacia abajo (Z5:AD5, Z6:AD6,....) hay datos también, estos deben pegarse también a la columna año debajo del primer rango.
Hay un campo en donde esta el año de la plantilla (A5), la idea es que a continuación de todos los datos columna concepto, se pegue el año (Es decir, al frente de cada dato de esa columna debe ir el año).
Esta hoja de Excel tiene varias Hojas con la misma información, lo único que cambia es el año, por en de en la columna concepto y año deben ir todos los datos de los rangos descritos arriba de todas las hojas.
Cuando te indico que no se deben exportar datos en blanco me refiero por ejemplo a que en la posición Z4 no hay nada, al exportar a la nueva hoja debe omitir ese espacio y continuar con el A4.
Este tema es el mismo tema que te solicite en las preguntas anteriores, lo que cambia es que debe hacer parte de una macro ya realizada.
Saludos y mil gracias.
Envíame tu archivo con la macro y me explicas con un ejemplo cómo debería quedar la información.
Mi correo [email protected]
En el asunto del correo escribe tu nombre de usuario “Angelito junino” y el título de esta pregunta.
Avísame en esta pregunta cuando me lo hayas enviado.
‘
S a l u d o s . D a n t e A m o r
H o l a:
Este código va en la macro: CrearAPlanoCrearAPlano
'Crear hoja conceptos 'Por. Dante Amor Dim l2, h2, h, u Set l2 = Workbooks(nuevLib) l2.Sheets.Add after:=l2.Sheets(l2.Sheets.Count) l2.Sheets(l2.Sheets.Count).Name = "Conceptos" Set h2 = l2.Sheets("Conceptos") For Each h In ThisWorkbook.Sheets If Left(h.Name, 2) = "HT" Then h.Range("U8:AX8").Copy u = Range("A" & Rows.Count).End(xlUp).Row + 1 h2.Range("B" & u).PasteSpecial Paste:=xlValues, Transpose:=True h2.Range("A" & u & ":A" & u + 29) = Right(h.Name, 4) End If Next 'Fin.Por.Dante Amor
Tienes que ponerlo antes de de esta línea:
ActiveWorkbook.Worksheets(1).Select
S a l ud o s
Gracias,
La macro funciona correctamente
Quisiera que me ayudaras con otro detalle: No deben aparecer datos en blanco al frente de los años, estos aparecen porque estas tomando todo el rango, pero hay que considerar que si esos campos del rango están vacíos no se deben exportar, sólo los que contienen Datos.
Saludos y mil gracias
Este es el código actualizado:
'Crear hoja conceptos 'Por. Dante Amor Dim l2, h2, h, u, c Set l2 = Workbooks(nuevLib) l2.Sheets.Add after:=l2.Sheets(l2.Sheets.Count) l2.Sheets(l2.Sheets.Count).Name = "Conceptos" Set h2 = l2.Sheets("Conceptos") h2.[A1] = "AÑO" h2.[B1] = "CONCEPTO" For Each h In ThisWorkbook.Sheets If Left(h.Name, 2) = "HT" Then For c = Columns("U").Column To Columns("AX").Column If h.Cells(8, c) <> "" Then u = Range("A" & Rows.Count).End(xlUp).Row + 1 h2.Range("A" & u) = Right(h.Name, 4) h2.Range("B" & u) = h.Cells(8, c) End If Next End If Next 'Fin. Por. Dante Amor
Hola Sr. Amor,
Necesito otra cosita más si es posible que me ayudes.
Aparte del rango que te indique (U8:AX8), existe otro (BP8:DL8).
Como quedaría la macro donde la idea es recorrer estos dos rangos por cada Hoja y poner en la columna Conceptos primero el rango (U8:AX) y abajo EL (BP8:DL8)
Mil gracias.
- Compartir respuesta
1 respuesta más de otro experto
Esta es la macro:
Option Private Module
Option Explicit
Public Rf1aP As Range
Public Const Rff1aP As String = "A1:JZ1" 'borra WWW OK
Public Rf2aP As Range
Public Const Rff2aP As String = "A2:K2" 'rg copiar los encabezados en el nuevo Ap OK se debe reemplazar x el rango
Public Rf5aP As Range
Public Const Rff5aP As String = "A3:K5" 'rg copiar los encabezados AP OK
Public Rf7aP As Range
Public Const Rff7aP As String = "A7:JZ7" 'codConceptosAP OK
Public Const CantColumAp As Integer = -11 ' cantidad colum q vuelve a "A" para pegar desde AP
Public Const CantValCon As Integer = 36 ' cantidad colum q vvalida contenido HT
Sub CreaRngosApLano()
Set Rf1aP = Range(Rff1aP) 'rg para borrar WWW
Set Rf2aP = Range(Rff2aP) 'rg copiar los encabezados en el nuevo Ap
Set Rf5aP = Range(Rff5aP) 'rg para crear filtros
Set Rf7aP = Range(Rff7aP) 'rg para copiar codConceptosAP
End Sub
Sub CrearAPlano()
Sheets("AP").Select
Application.ScreenUpdating = False
Sheets("AP").Unprotect ClaHTws
Range("N5").FormulaR1C1 = _
"=IF(OR(R[-2]C="""",R[-2]C[1]="""",R[-2]C[4]="""",R[-2]C[5]="""",R[-2]C[7]="""",R[-2]C[8]="""",R[-2]C[2]="""",R[-2]C[3]=""""),1,0)"
If Range("N5").Value = 1 Then
MsgBox "Debe completar la información poder continuar", vbExclamation + vbOKOnly, "HT"
Range("N5").Value = ""
Sheets("AP").Protect ClaHTws
Else
Range("T3").FormulaR1C1 = _
"=""'""&RIGHT(""000000000000000""&RC[-6],15)&RIGHT(""00""&DAY(RC[-2]),2)&RIGHT(""00""&MONTH(RC[-2]),2)&YEAR(RC[-2])&RIGHT(""0000""&RC[-1],4)&RC[2]"
Nomlib = Range("T3").Value
Range("C1").Value = Nomlib
Range("N5").Value = ""
Range("T3").Value = Nomlib
Nomlib = ActiveSheet.Range("C1").Value
estLib = ThisWorkbook.Name
Hojaaa = Range("B1").Value
Windows(estLib).Activate
ValidaConten '''
If ValContHoja >= 1 Then
Else
Const ruta = "C:\HT\"
Dim Path As String, NombreCarpeta As String
Path = "C:\"
NombreCarpeta = "HT"
If Dir(Path, vbDirectory) <> "" Then
If Dir(Path & NombreCarpeta, vbDirectory) = "" Then MkDir Path & NombreCarpeta
End If
Dim NewBook As Object
Set NewBook = Workbooks.Add
With NewBook
.SaveAs ruta & Nomlib
End With
nuevLib = ActiveWorkbook.Name
Dim y As Integer, x As Integer
y = ActiveWorkbook.Sheets.Count
For x = y To Hojaaa - 1
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
Next x
Windows(estLib).Activate
Sheets("AP").Select
Range("A1").Select
nomHoja = ActiveCell.Value
Sheets(nomHoja).Select
Set Rf5aP = Range(Rff5aP) 'rg para crear filtros
Rf5aP.Select
Selection.Copy
Windows(nuevLib).Activate
Sheets("Hoja1").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Windows(estLib).Activate
Set Rf7aP = Range(Rff7aP) 'rg para copiar codConceptosAP
Rf7aP.Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows(nuevLib).Activate
Range("K1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A2").Select
Range("A2").EntireRow.Delete
Set Rf1aP = Range(Rff1aP) 'rg para borrar WWW
Rf1aP.Select
Selection.Replace What:="www", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Rf1aP.Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireColumn.Delete
Range("A1").Select
ActiveSheet.Name = Range("A2").Value
Dim VuEl As Integer
VuEl = 0
If Range("K1").Value > 0 Then FilExport = 1
If Range("K2").Value > 0 Then FilExport = 2
If Range("K3").Value > 0 Then FilExport = 3
Select Case FilExport
Case 1
VuEl = 1
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
Case 2
SeparaFisc
ActiveSheet.Protect "NominaugppAP"
VuEl = 0
Case Is > 2
Set Rf2aP = Range(Rff2aP) 'rg copiar los encabezados en el nuevo Ap
Rf2aP.Select
Selection.Copy
Range("L1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, CantColumAp).Range("A1").Select
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
SeparaFisc
ActiveSheet.Protect "NominaugppAP"
VuEl = 0
End Select
For x = 2 To Hojaaa
If VuEl = 1 Then ActiveSheet.Select Else ActiveSheet.Next.Select 'ActiveSheet.Previous.Select
Windows(estLib).Activate
Sheets("AP").Select
ActiveCell.Offset(1, 0).Range("A1").Select
nomHoja = ActiveCell.Value
Sheets(nomHoja).Select
Set Rf5aP = Range(Rff5aP) 'rg para crear filtros
Rf5aP.Select
Selection.Copy
Windows(nuevLib).Activate
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Windows(estLib).Activate
Sheets("AP").Protect ClaHTws
Set Rf7aP = Range(Rff7aP) 'rg para copiar codConceptosAP
Rf7aP.Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows(nuevLib).Activate
Range("K1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A2").Select
Range("A2").EntireRow.Delete
Set Rf1aP = Range(Rff1aP) 'rg para borrar WWW
Rf1aP.Select
Selection.Replace What:="www", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Rf1aP.Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireColumn.Delete
Range("A1").Select
ActiveSheet.Name = Range("A2").Value
If Range("K1").Value > 0 Then FilExport = 1
If Range("K2").Value > 0 Then FilExport = 2
If Range("K3").Value > 0 Then FilExport = 3
Select Case FilExport
Case 1
VuEl = 1
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
Case 2
SeparaFisc
ActiveSheet.Protect "NominaugppAP"
VuEl = 0
Case Is > 2
Set Rf2aP = Range(Rff2aP) 'rg copiar los encabezados en el nuevo Ap
Rf2aP.Select
Selection.Copy
Range("L1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, CantColumAp).Range("A1").Select
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
SeparaFisc
ActiveSheet.Protect "NominaugppAP"
VuEl = 0
End Select
Next x
ActiveWorkbook.Worksheets(1).Select
Range("A1").Select
Workbooks(nuevLib).Save
MsgBox "Se exporto satisfactoriamente el archivo ", vbInformation + vbOKOnly, MSG
End If
End If
End Sub
Sub SeparaFisc()
Dim MartiK As String
MartiK = Range("A1").Value
Range("A1").FormulaR1C1 = "=COUNTA(R[1]C:R[1048575]C)"
Range("A1").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
InserFilaOtras = Range("A1").Value
Range("A1").Value = MartiK
Select Case TipoHT
Case "FISCALIZACION"
Rows("1:1").Select
Range("BV1").Activate
Selection.Find(What:="82", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Case "LIQUIDACION"
Rows("1:1").Select
Range("BV1").Activate
Selection.Find(What:="113", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
End Select
ActiveCell.Offset(1, 1).Range("A1").Select
Selection.EntireColumn.Insert
Selection.EntireColumn.Insert
ActiveCell.Offset(-1, -1).Range("A1").Select
ActiveCell.Resize(InserFilaOtras + 1, 1).Select
Selection.Replace What:="ok", Replacement:="", LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.Offset(-1, 0).Range("A1").Select
ActiveCell.Formula = "=CELL(""direccion"",RC)"
ActiveCell.Resize(2, 1).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Replace What:="$", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.Offset(-1, 0).Range("A1").Select
Dim LaCel As String
LaCel = ActiveCell.Value
ActiveCell.Resize(InserFilaOtras + 1, 1).Select
Selection.TextToColumns Destination:=Range(LaCel), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, OtherChar _
:=";", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
TrailingMinusNumbers:=True
Select Case TipoHT
Case "FISCALIZACION"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.Value = 98
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveCell.Value = 97
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveCell.Value = 82
Case "LIQUIDACION"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.Value = 126
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveCell.Value = 125
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveCell.Value = 113
End Select
ActiveCell.Resize(InserFilaOtras + 1, 3).Select
Selection.Replace What:="ok", Replacement:="", LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
Sub verNombreHojas() ' ok
Sheets("AP").Select
Application.ScreenUpdating = False
Sheets("AP").Unprotect ClaHTws
Range("A1:M20").Clear
Range("N5").FormulaR1C1 = _
"=IF(OR(R[-2]C="""",R[-2]C[1]="""",R[-2]C[4]="""",R[-2]C[5]="""",R[-2]C[7]="""",R[-2]C[8]="""",R[-2]C[2]="""",R[-2]C[3]=""""),1,0)"
If Range("N5").Value = 1 Then
MsgBox "Debe completar la información poder continuar", vbExclamation + vbOKOnly, MSG
Range("N5").Value = ""
Else
Dim i As Integer, oH As Integer
Dim h As Variant
Range("T3").FormulaR1C1 = _
"=""'""&RIGHT(""000000000000000""&RC[-6],15)&RIGHT(""00""&DAY(RC[-2]),2)&RIGHT(""00""&MONTH(RC[-2]),2)&YEAR(RC[-2])&RIGHT(""0000""&RC[-1],4)&RC[2]"
Nomlib = Range("T3").Value
Cells(1, 2).Value = ActiveWorkbook.Sheets.Count
i = 1
oH = 0
For Each h In ActiveWorkbook.Sheets
If Mid(ActiveWorkbook.Sheets(i).Name, 1, 2) = "HT" Then
Cells(i, 1) = h.Name
i = i + 1
oH = oH + 1
End If
Next h
Cells(1, 2).Value = oH
Range("C1").Value = Nomlib
Range("N5").Value = ""
Range("T3").Value = Nomlib
Range("A1").Select
End If
Range("A1:B20").Select
Selection.Locked = False
Selection.FormulaHidden = False
Range("B1").Select
Sheets("AP").Protect ClaHTws
End Sub
Sub ValidaConten()
Sheets("AP").Select
Range("A1").Select
nomHoja = ActiveCell.Value
Sheets(nomHoja).Select
ActiveSheet.Unprotect ClaHTws
TipoHT = Range("H2").Value
Range("J1").Select
Range("J1").FormulaR1C1 = "=SUM(RC[1]:RC[36])"
Range("K1").Select
Range("K1").FormulaR1C1 = "=IF(AND(COUNTA(R[8]C:R[999999]C)>0,R[7]C=""""),1,0)"
Range("K1").Copy
Range("K1").Select
ActiveCell.Resize(1, CantValCon).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("K1").Select
ActiveCell.Resize(1, CantValCon).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ValContHoja = Range("J1").Value
If ActiveSheet.FilterMode = True Then
ValContHoja = 2
Range("J1").Select
ActiveCell.Resize(1, CantValCon + 1).Select
Selection.ClearContents
Range("K8").Select
MsgBox "Primero debe quitar la selección de los filtros", vbInformation + vbOKOnly, MSG
Else
If ValContHoja >= 1 Then
Range("J1").ClearContents
Range("K1").Select
ActiveCell.Resize(1, CantValCon).Select
Selection.Find(What:="1", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Selection.ClearContents
ActiveCell.Offset(7, 0).Range("A1").Select
MsgBox "Debe Ingresar y/o seleccionar el titulo para las columnas con valores", vbCritical + vbOKOnly, MSG
Else
Range("J1").Select
ActiveCell.Resize(1, CantValCon + 1).Select
Selection.ClearContents
RecacularassAPPPP
End If
End If
ActiveSheet.Protect Password:=ClaHTws, DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
Do While ValContHoja = 0
Sheets("AP").Select
ActiveCell.Offset(1, 0).Range("A1").Select
nomHoja = ActiveCell.Value
If nomHoja = "" Then Exit Do
Sheets(nomHoja).Select
ActiveSheet.Unprotect ClaHTws
Range("J1").Select
Range("J1").FormulaR1C1 = "=SUM(RC[1]:RC[36])"
Range("K1").Select
Range("K1").FormulaR1C1 = "=IF(AND(COUNTA(R[8]C:R[999999]C)>0,R[7]C=""""),1,0)"
Range("K1").Copy
Range("K1").Select
ActiveCell.Resize(1, CantValCon).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("K1").Select
ActiveCell.Resize(1, CantValCon).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ValContHoja = Range("J1").Value
If ActiveSheet.FilterMode = True Then
ValContHoja = 2
Range("J1").Select
ActiveCell.Resize(1, CantValCon + 1).Select
Selection.ClearContents
Range("K8").Select
MsgBox "Primero debe quitar la selección de los filtros", vbInformation + vbOKOnly, MSG
Else
If ValContHoja >= 1 Then
Range("J1").ClearContents
Range("K1").Select
ActiveCell.Resize(1, CantValCon).Select
Selection.Find(What:="1", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Selection.ClearContents
ActiveCell.Offset(7, 0).Range("A1").Select
MsgBox "Debe seleccionar el titulo para las columnas con valores", vbCritical + vbOKOnly, MSG
Else
Range("J1").Select
ActiveCell.Resize(1, CantValCon + 1).Select
Selection.ClearContents
RecacularassAPPPP
End If
End If
ActiveSheet.Protect Password:=ClaHTws, DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
Loop
End Sub
- Compartir respuesta