如何使用地址中的变量引用其他工作簿中的单元格

时间:2017-07-25 07:42:50

标签: excel-vba vba excel

我需要在两个工作簿的单元格地址中使用变量。这就是我开始的方式。

我正在检查活动工作簿中AE列中的单元格与主工作表中T列中的单元格,如果匹配,我想在主工作表的同一行上将T中的1放入。

For x = 2 to 1000
   If AE("X") = Workbooks(master.xlsx).I("X") Then Workbooks(master.xlsx).T("x"), 1, 0
Next x

1 个答案:

答案 0 :(得分:1)

在Excel中使用VBA时,您必须记住代码是愚蠢的 - 您需要准确解释每次要引用它时的所有内容。

因此,AE("X")可以由人根据您的描述性文本翻译并查看其余代码。另一方面,VBA将查看AE,意识到它不是代码字,但后面跟括号,所以会认为它是某种尚未声明的数组并开始抛出各种错误。

因此,AE("X")是Excel应用程序中命名工作簿中命名工作表中行AE的列X中的单元格。 VBA知道点什么!它知道它在Excel中,所以我们不必每次都告诉它 - 我们必须告诉它一切,否则它开始做出假设并且通常会弄错。

因此.... 您的工作簿为"Master.xlsx"。这是一个与代码所在的工作簿不同的工作簿 - 它具有xlsx扩展名,因此不能包含任何VBA代码。工作簿也是打开的,否则您需要使用工作簿的完整路径并告诉它打开它。

此代码声明一个名为wrkBk的变量,然后将其设置为引用Master.xlsx工作簿。由于文件名是一串文本字符,我们需要将其放在引号内。现在,只要我们需要引用工作簿,我们就可以使用wrkBk

Dim wrkBk As Workbook
Set wrkBk = Workbooks("Master.xlsx")  

如果工作簿已关闭,则使用
Set wrkBk = Workbooks.Open("<full path to workbook>\Master.xlsx") 您可以使用一些特殊关键字代替Workbooks来引用特定的打开工作簿:Set wrkBk = ThisWorkbook将引用您的VBA代码所在的工作簿,Set wrkBk = ActiveWorkbook将引用当前处于活动状态的工作簿

下一步是引用工作簿中的正确工作表。我们知道工作表将位于Master.xlsx工作簿中,因此需要引用 - 如果我们不这样做,那么代码将假定我们的意思是代码执行时处于活动状态的工作簿。现在,只要我们使用wrkSht,代码就会知道Sheet1工作簿中的Master.xlsx(我们不使用wrkBk.wrkSht因为wrkSht已经知道约wrkBk)。

Dim wrkSht As Worksheet
Set wrkSht = wrkBk.Worksheets("Sheet1")

是的,现在我们已准备好引用工作簿中的单元格。有很多方法可以引用一个单元格 - 它是Range个单元格,所以你可以使用wrkSht.Range("A1"),它也可以是一个单元格,所以你可以使用wrkSht.Cells(1,1)表示位于第1行和第1列的单元格,您甚至可以使用wrksht.Range(wrksht.Cells(1,1), wrksht.Cells(5,1)),这意味着从第1行,第1列到第5行,第1列的一系列单元格。这也可以写为wrksht.Range("A1:A5") 。注意 - 在每次引用一个单元格之前,我告诉它单元格在哪个工作表上。

现在,进入循环并使用X引用单元格 For x = 2 To 1000: Next x。这将起作用并增加x所持有的价值 您希望以数字形式查看列AE - 第31列 wrksht.Range("x")将无效,因为它会查看文字字符串“x”而不是它代表的数字 - 代码也没有提到列。
所以wrkSht.Cells(x,31)x周围没有引号。当您的循环继续时,这会引用单元格AE2AE3AE4等。

最后,将值放在单元格中 - 用简单的英语表示基本上是说引用单元格的值等于我给它的值,或者在VBA中wrkSht.Cells(31,x) = 1

您的最终代码与正确的参考设置类似于:

Sub Test()

    Dim wrkBk As Workbook
    Dim wrkSht As Worksheet
    Dim x As Long

    'Set reference to external workbook.
    Set wrkBk = Workbooks("Master.xlsx")
    Set wrkSht = wrkBk.Worksheets("Sheet1")

    For x = 2 To 1000
        'I haven't used variables here - just referenced the correct cells within the ActiveWorkbook.
        'You may find it better to use ThisWorkbook instead.

        'This is an IF...END IF block which allows you write multiple lines of code for each condition.
        'For one line you could combine the first two lines in the block - but you wouldn't have the ELSE condition.
        If ActiveWorkbook.Worksheets("Sheet1").Cells(x, 31) = wrkSht.Cells(x, 9) Then
            wrkSht.Cells(x, 20) = 1
        Else
            wrkSht.Cells(x, 20) = 0
        End If
    Next x

End Sub  

希望这不是太罗嗦......开始中途迷路了。 :)