我正在尝试收集水平数据(从左到右)从单元格I10开始 - 我首先尝试编写宏以在列I中识别正确的分类帐帐户。第I列在下面,I:10表示列我想要,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
我有下面的代码,我试图将单元格中的数据插入到I10的右边(I:10到Z:10)到数组中。
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
答案 0 :(得分:1)
我发现你的问题令人困惑。
示例1:什么是I:10 to Z:10
?您的意思是I10 to Z10
还是I10:Z10
?冒号位于两个单个单元格地址之间以定义范围。
示例2:文本暗示帐户名列表在第I列(= 9),但您的代码搜索第1列(= A)。
在这个答案中,我向你提供的信息,我希望能指出你正确的方向。
考虑:Set ws = ThisWorkbook.Sheets(1)
。
用户可以打开多个工作簿。让我们调用A,B,C和D.用户可以激活A但在D中调用宏。如果可能出现这种情况,您可以使用ActiveWorkbook
来引用活动工作簿和{{1} }引用包含宏的工作簿。如果您认为用户可能会从另一个工作簿中调用该宏,那么您可以明确地确定您需要包含该宏的工作簿中的工作表。否则ThisWorkbook
会在活动工作簿中为您提供工作表。
避免使用Set ws = Sheets(1)
或Sheets(1)
。这里1和2指的是标签行中的序列,用户可以有意或无意地更改。创建一个新工作簿并将此代码复制到模块:
Sheets(2)
如果您的英文版Excel具有默认的工作表数量,则此宏会将以下内容输出到立即窗口:
Option Explicit
Sub Test1()
Dim InxWsht As Long
For InxWsht = 1 To Worksheets.Count
Debug.Print Worksheets(InxWsht).Name
Next
End Sub
现在移动Sheet2,使其在Sheet3之后重新运行宏。输出现在是:
Sheet1
Sheet2
Sheet3
始终按名称识别工作表;例如:工作表(“Ledgers”),因此用户不会意外破坏您的宏。
考虑Sheet1
Sheet3
Sheet2
正如我所说的那样,虽然你的文字是第一列,但是这会搜索第一列。这可能只是一个印刷错误,但最好避免在代码正文中使用字符串。在添加新列或用户想要新序列时,列会移动。搜索代码以尝试识别哪些数字引用一列以便您可以更新它们可能是一个容易避免的噩梦。
Set aCell = .Columns(1).Find . . .
或
Const ColName As Long = 9
允许你写
Const ColName As String = "I"
现在,如果包含分类帐名称的列移动,则顶部的一个更改将更新代码。还有一个优点是“ColName”对未来的维护程序员(可能是您)意味着什么。如果您曾尝试更新作者引用20个不同列的宏,您就会理解为什么我喜欢名字。
我将您的名字列表加载到工作表“Ledgers”的“A”列。以下是您的宏的修改版本。研究我的变化并试图理解我为什么做这些变化。尽可能回答问题,但是你可以为自己解决的问题越多,你的发展就越快。
Set aCell = .Columns(ColName).Find . . .