/ / 1º) Identifique la columna 2º) Identifique el valor en la columna 3) Inserte los datos de esa fila en la matriz: excel, vba, excel-vba

1º) Identifique la columna 2º) Identifique el valor en la columna 3) Inserte los datos de esa fila en la matriz: excel, vba, excel-vba

Estoy tratando de recopilar los datos horizontales (izquierdaa la derecha) Comenzando en la celda I10: primero estoy tratando de codificar la macro para identificar la cuenta del libro mayor correcta en la columna I. La columna I está abajo con I: 10 que presenta la columna que quiero, Dividend Income

Ledger Account
Prior Shares Outstanding
Current Shares Outstanding
Current Share Activity
Previous Net Assets
Current Net Assets
Net Asset Change
Market Value
Trading Gain Loss
Dividend Income

Tengo el siguiente código, estoy tratando de insertar los datos en las celdas a la DERECHA de I10 (I: 10 a Z: 10) en una matriz.

Sub Sample()
Dim ws As Worksheet
Dim MyAr As Variant
Dim SearchString As String
Dim aCell As Range
Dim i As Long

SearchString = "Ledger Account"

"~~> Change this as applicable
Set ws = ThisWorkbook.Sheets(1)

With ws
Set aCell = .Columns(1).Find(What:=SearchString, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

If Not aCell Is Nothing Then
"~~> 5 Denotes the 5th column i.e Column "E"
"~~> Amend as applicable
"~~> Store the values From say Col B to E in the array
MyAr = Application.Transpose( _
.Range(.Cells(aCell.Row, 2), _
.Cells(aCell.Row, 5) _
).Value _
)

"~~> Check what is in the array
For i = LBound(MyAr) To UBound(MyAr)
Debug.Print MyAr(i, 1)
Next i
End If
End With
End Sub

Respuestas

1 para la respuesta № 1

Encuentro tu pregunta confusa.

Ejemplo 1: lo que es I:10 to Z:10? Quieres decir I10 to Z10 o I10:Z10? Los dos puntos van entre dos direcciones de celda individuales para definir un rango.

Ejemplo 2: el texto implica que la lista de nombres de cuentas se encuentra en la columna I (= 9), pero su código busca en la columna 1 (= A).

En esta respuesta, te doy información que espero te guíe en la dirección correcta.


Considerar: Set ws = ThisWorkbook.Sheets(1).

El usuario puede tener varios libros abiertos. Llamemos a continuación A, B, C y D. El usuario puede tener A activo pero llamar a una macro en D. Cuando esta situación sea posible, puede usar ActiveWorkbook para referirse al libro de trabajo activo y ThisWorkbook para referirse al libro de trabajo que contiene la macro. Si cree que existe la posibilidad de que el usuario llame a la macro desde otro libro de trabajo, es correcto que identifique específicamente que desea una hoja de trabajo del libro que contiene la macro. De otra manera Set ws = Sheets(1) Le habría dado una hoja de trabajo dentro del libro activo.

Evitar Sheets(1) o Sheets(2). Aquí, el 1 y el 2 se refieren a la secuencia dentro de la fila de pestañas que el usuario puede cambiar fácilmente de forma deliberada o accidental. Cree un nuevo libro de trabajo y copie este código en un módulo:

Option Explicit
Sub Test1()

Dim InxWsht As Long

For InxWsht = 1 To Worksheets.Count
Debug.Print Worksheets(InxWsht).Name
Next

End Sub

Si tiene una versión en inglés de Excel con el número predeterminado de hojas, esta macro mostrará lo siguiente en la ventana Inmediato:

Sheet1
Sheet2
Sheet3

Ahora mueva Sheet2 para que esté después de Sheet3 y vuelva a ejecutar la macro. La salida es ahora:

Sheet1
Sheet3
Sheet2

Siempre identifique las hojas de trabajo por su nombre; por ejemplo: Hojas de trabajo ("Libros de contabilidad") para que el usuario no pueda romper su macro accidentalmente.


Considerar Set aCell = .Columns(1).Find . . .

Como dije esto, busca en la columna 1 aunque tuel texto dice la columna I. Esto podría ser un error tipográfico, pero es mejor evitar el uso de literales para las columnas en el cuerpo de su código. Las columnas se mueven a medida que se agregan nuevas columnas o los usuarios desean una nueva secuencia. La búsqueda en el código que intenta identificar qué números se refieren a una columna para que pueda actualizarlos puede ser una pesadilla que se evita fácilmente.

Const ColName As Long = 9

o

Const ColName As String = "I"

te permite escribir

Set aCell = .Columns(ColName).Find . . .

Ahora si la columna que contiene los nombres de contabilidadSe mueve, un cambio en la parte superior actualiza el código. También existe la ventaja de que "ColName" significa algo para un futuro programador de mantenimiento (que podría ser usted). Si alguna vez intentaste actualizar una macro en la que el autor hace referencia a 20 columnas diferentes por número, entenderías por qué me gustan los nombres.


Cargué su lista de nombres en la columna "A" dehoja de trabajo "Libros de contabilidad". A continuación se muestra una versión modificada de su macro. Estudia mis cambios y trata de entender por qué los hice. Regrese con las preguntas según sea necesario, pero cuanto más pueda trabajar por sí mismo, más rápido se desarrollará.

Sub Sample()

Const ColName As Long = 1
Const ColFirstWanted As Long = 2

Dim ws As Worksheet
Dim MyAr As Variant
Dim SearchString As String
Dim aCell As Range
Dim ColCrnt As Long   " Avoid names like i; they can get very confusing.
Dim ColLast As Long

SearchString = "Dividend Income"

"~~> Change this as applicable
Set ws = Worksheets("Ledgers")

With ws
Set aCell = .Columns(ColName).Find(What:=SearchString, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

If Not aCell Is Nothing Then
" Find last used column in row
ColLast = .Cells(aCell.Row, Columns.Count).End(xlToLeft).Column

"~~> Amend as applicable
"~~> Store the values From say Col B to E in the array
"## Note: Transpose is slow when called from VBA.
MyAr = .Range(.Cells(aCell.Row, ColFirstWanted), .Cells(aCell.Row, ColLast)).Value

"~~> Check what is in the array
" ## Note: Although the worksheet row is not 1 and the first column is not 1,
" ##       the lower bounds are both 1. This can be confusing. I suggest
" ##       loading the entire row so the worksheet column numbers match the array
" ##       column numbers.  A few extra columns in the array is a small price to pay
" ##       reduced confusion.
For ColCrnt = LBound(MyAr, 2) To UBound(MyAr, 2)
Debug.Print ColCrnt & " " & MyAr(1, ColCrnt)
Next ColCrnt
End If
End With
End Sub