我有一个自定义的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
答案 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
,或将数组放入普通模块中。在普通模块中声明的公共变量可以全局访问,而无需指定模块名称。