在Sheet1上无法使用ThisWorksheet上的数组

时间:2018-09-07 18:00:20

标签: arrays excel vba

我有一个自定义的Excel时间表。当我从下拉列表中选择活动类型时,我想在一个列中填充活动代码。

我正在使用vba将代码表和类型表分配给数组,我已经在ThisWorkbook上做到了。在时间表页面(Sheet1)上,我创建了实际上与类型匹配的代码,并在代码列中输入了一个值(我首先测试了当前日期作为概念证明)。但是,当我去匹配数组值(以便分配代码)时,我会遇到类型不匹配的情况,因为在Sheet1(但在ThisWorksheet)上不存在该数组。

我尝试将Array值设置为全局值,创建新的数组变量并将原始数组分配给辅助全局数组,但都没有成功。我正在忽略某些东西,但我正在画空白。


此工作簿:


Option Explicit
Dim KeyArrTrans As Variant

Sub Workbook_Open()

    Dim LastRow As Integer
    Dim KeyArr As Variant

    With Sheets("Key")
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    'Debug.Print LastRow

    KeyArr = Sheets("Key").Range("A3:B" & LastRow).Value

    'WriteArrayToImmediateWindow KeyArr
    KeyArrTrans = KeyArr

    'Debug.Print KeyArr(1, 1)

End Sub

Sub WriteArrayToImmediateWindow(arrSubA As Variant)

    Dim rowString As String
    Dim iSubA As Long
    Dim jSubA As Long

    rowString = ""

    Debug.Print
    Debug.Print
    Debug.Print "The array is: "

    For iSubA = 1 To UBound(arrSubA, 1)
        rowString = arrSubA(iSubA, 1)
        For jSubA = 2 To UBound(arrSubA, 2)
            rowString = rowString & "," & arrSubA(iSubA, jSubA)
        Next jSubA
        Debug.Print rowString
    Next iSubA

End Sub

Sheet1:


Sub Worksheet_Change(ByVal Target As Range)

    Dim tRowX As Integer
    Dim tColX As Integer
    Dim WorkPerfCol As Integer
    Dim ActivCol As Integer
    Dim WorkValue As String
    Dim curDate As Date
    Dim tArr As Integer
    Dim i As Long
    Dim KeyUBound As Integer

    WorkPerfCol = 3
    ActivCol = 2
    Debug.Print UBound(KeyArrTrans, 1)
    'KeyUBound = UBound(KeyArrTrans, 1)

    If Target.Count = 1 Then
        If Target.Column = WorkPerfCol And Target.Row >= 29 And Target.Row <= 41 Then

            tColX = Target.Column
            tRowX = Target.Row
            WorkValue = Cells(tRowX, tColX).Value

            For i = 1 To KeyUBound
                If KeyArrTrans(i, 2) = WorkValue Then
                    Debug.Print KeyArrTrans(i, 2), KeyArrTrans(i, 1)
                    'ActiveSheet.Cells(tRowX,ActivCol.Value = KeyArrTrans(i,1))
                End If
            Next

            Debug.Print WorkValue, tColX, tRowX
            curDate = Date
            'ActiveSheet.Cells(tRowX, ActivCol).Value = curDate

        End If
    End If


End Sub

2 个答案:

答案 0 :(得分:3)

Dim关键字声明一个局部变量。在模块级别使用时,它声明一个具有模块范围的 private 变量,即与使用Private关键字声明的变量完全相同。因此,最好将Dim用于本地变量,将Private用于模块变量。

ThisWorkbook是一种特殊的模块-它是一个文档模块,它是一个 class ,是继承成员的基类-在这种情况下为Excel.Workbook类。 ThisWorkbook还是全局标识符,是指ThisWorkbook类的实例,可在您的VBA项目中全局访问。

作为类模块,可以给定类的实例,从该模块外部访问任何Public成员。由于存在以该类命名的全局对象变量,因此可以使用Public访问其ThisWorkbook.MemberName成员。

因此,您可以使用KeyArrTrans关键字声明Public,从而有效地使其成为全局变量(即,与在标准模块中将其声明为公共变量并有效地使用模块的名称)。

由此产生的问题是,现在项目中任何地方的任何代码都可以使用该变量,并将其指向其他地方

您最可能希望/需要的是不能从其他模块更改实际的数组指针,而只能访问其内容。如果您需要将数组内容公开为只读数据,则需要编写自己的数据结构...这可能会大材小用。

因此,相反,您可以封装数组指针并将其公开为仅获取属性,方法是将声明保持为私有(Dim / {{ 1}}),然后向Private中添加一个Public Property Get成员:

ThisWorkbook

通过这种方式(即,无需公开Public Property Get AllTheKeys() As Variant AllTheKeys = KeyArrTrans End Property 变异器),其他代码就可以读取数组并写入其元素,但是它们不能分配给数组本身-保护是由编译器强制执行的!

现在,您可以通过Public Property Let公开的AllTheKeys属性访问数组:

ThisWorkbook

答案 1 :(得分:1)

ThisWorkbook是一个类模块。它代表一个对象。如果不指定对象名称,则无法寻址在该对象上声明的字段。

因此,可以使用KeyArrTrans关键字(而不是Public声明Dim并将地址KeyArrTrans设置为ThisWorkbook.KeyArrTrans,或将数组放入普通模块中。在普通模块中声明的公共变量可以全局访问,而无需指定模块名称。