Vba 将vb对象关联到特定工作表
我正在Excel(Office 2010)中使用VB 我有一个名为Problem的类和一个生成随机问题的vb代码,为每个问题创建一个新的工作表,并将问题的参数打印到该工作表中 当我处理该工作表时,我需要存储在生成工作表的问题对象实例中的一些参数,并动态更改它们 我想做的是将问题的实例与其工作表相关联 比如:Vba 将vb对象关联到特定工作表,vba,excel,Vba,Excel,我正在Excel(Office 2010)中使用VB 我有一个名为Problem的类和一个生成随机问题的vb代码,为每个问题创建一个新的工作表,并将问题的参数打印到该工作表中 当我处理该工作表时,我需要存储在生成工作表的问题对象实例中的一些参数,并动态更改它们 我想做的是将问题的实例与其工作表相关联 比如: Dim p as Problem Set p = new Problem Worksheet("Problem 1").**myCurrentProblem** = p 然
Dim p as Problem
Set p = new Problem
Worksheet("Problem 1").**myCurrentProblem** = p
然后访问变量myCurrentProblem
有办法吗
提前谢谢。或者让一个类,例如问题单绑定工作表和问题实例,怎么样?这些实例将存储在问题表的集合中。示例(示例有点太长,但HTH) 此工作簿类代码: 问题类模块:(仅用于测试目的) 问题单类模块: 标准模块代码:
你能不能换一种方式。。。在你的
问题
类中,可能存储一个工作表变量?你是指对象的类属性吗?我有一个函数,它获取一个问题实例和一些更多的数字,我希望它从工作表中获取并计算一些东西。类似这样:=myFunction(这个问题的实例,E5,D7),但我无法访问问题的实例,因为我不知道它是哪一个。我可以通过保存问题和工作表的全局集合来传递它,但我更希望它与工作表关联。您不能将任意属性指定给工作表对象,但可以在工作表的代码模块中定义一个currentProblem
字段,并将对象指定给该字段。不过,你必须对每张纸都这样做。全局集合将更易于管理,因为它不需要工作表模块中的代码。@您可以将这些任意属性(只要它们可以是字符串)分配给工作表的CustomXMLPart
。这是一个皮塔,但肯定有可能做到:)
Private m_problemSheets As Collection
Public Sub AddProblemSheet(problemSheetParameter As ProblemSheet)
If m_problemSheets Is Nothing Then _
Set m_problemSheets = New Collection
m_problemSheets.Add problemSheetParameter, problemSheetParameter.SheetInstance.Name
End Sub
Public Function ProblemOfSheet(sheetName As String) As ProblemSheet
On Error Resume Next
Set ProblemOfSheet = m_problemSheets(sheetName)
On Error GoTo 0
End Function
Private Sub Workbook_Open()
Set m_problemSheets = New Collection
End Sub
Public Name As String
Private m_problem As Problem
Private m_sheet As Worksheet
Public Sub Bind(problemParametr As Problem, sheetParameter As Worksheet)
Set m_problem = problemParametr
Set m_sheet = sheetParameter
End Sub
Public Property Get ProblemInstance() As Problem
Set ProblemInstance = m_problem
End Property
Public Property Set ProblemInstance(newProblem As Problem)
Set m_problem = newProblem
End Property
Public Property Get SheetInstance() As Worksheet
Set SheetInstance = m_sheet
End Property
Sub test()
Dim i As Integer
Dim newProblem As Problem
Dim newProblemSheet As ProblemSheet
' add data to collection first
For i = 1 To Worksheets.Count
Set newProblem = New Problem
newProblem.Name = "Problem_" & i
Set newProblemSheet = New ProblemSheet
newProblemSheet.Bind newProblem, Worksheets(i)
ThisWorkbook.AddProblemSheet newProblemSheet
Next
' get problem from collection by sheet name
Dim ps As ProblemSheet
Set ps = ThisWorkbook.ProblemOfSheet(Worksheets("Problem 1").Name)
If Not ps Is Nothing Then _
Debug.Print ps.ProblemInstance.Name
' set problem instance to another problem :-)
Dim myCurrentProblem As Problem
Set myCurrentProblem = New Problem
myCurrentProblem.Name = "myCurrentProblem 1"
Set ThisWorkbook.ProblemOfSheet(Worksheets("Problem 1").Name).ProblemInstance = myCurrentProblem
Debug.Print ThisWorkbook.ProblemOfSheet(Worksheets("Problem 1").Name).ProblemInstance.Name
End Sub