Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将vb对象关联到特定工作表_Vba_Excel - Fatal编程技术网

Vba 将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 然

我正在Excel(Office 2010)中使用VB

我有一个名为Problem的类和一个生成随机问题的vb代码,为每个问题创建一个新的工作表,并将问题的参数打印到该工作表中

当我处理该工作表时,我需要存储在生成工作表的问题对象实例中的一些参数,并动态更改它们

我想做的是将问题的实例与其工作表相关联 比如:

 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