1)识别列2)确定第3列中的值。将该行中的数据插入数组

时间:2015-09-23 16:41:58

标签: excel vba excel-vba

我正在尝试收集水平数据(从左到右)从单元格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

1 个答案:

答案 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 . . .