可以将excel单元格中的文本值定义为vba中的变量名称吗?

时间:2015-01-10 11:07:19

标签: excel vba excel-vba

我对VBA很新。实际上我的场景很复杂,所以让我先从一个例子开始,然后向你解释我到底需要什么。我将在excel中有三个工作表。

  1. 基础单

  2. 条件表

  3. 目的地表

  4. 基本表格将采用以下格式:

                 Column A    Column B   Column C    Column D
    Row1    Some text1    Some text2    Some text3  SETA
    Row2    Some text4    Some text5    Some text6  
    Row3    Some text7    Some text8    Some text9  
    Row4    Some text10   Some text11   Some text12 SETB
    Row5    Some text13   Some text14   Some text15 
    Row6    Some text16   Some text17   Some text18 SETC
    Row7    Some text19   Some text20   Some text21 
    Row8    Some text22   Some text23   Some text24 
    Row9    Some text25   Some text26   Some text27 
    

    正如您在上面的示例中看到的那样。它显示前3行用于" SETA",接下来的2行是" SETB"接下来的4行是" SETC"。在此表(BASE表)中,列号将是常量,因此每次我们将有4列,但每个SET中的行数以及SET的数量都是可变的。不同的用户可以在此工作表中输入不同的数据。

    工作表2 - 条件表将包含多个具有3个常量列的行,如下所示。

            Column A        Column B        Column C
    Row1    SETA                10         Replace text
    Row2    SETB                 5         Replace text
    Row3    SETC                 6         Replace text
    

    我的上一个工作表将有一个ActiveX按钮,所以当我点击该按钮时:

    • 宏将首先查看(条件表)的第一行,这意味着使用" SETA"在(基础表)。

    • 复制" SETA"数据

    • 在目标表单中粘贴10次,然后替换一些 文本。
    • 然后是第2行(条件表),现在它使用SETB在基础表中复制SETB 数据并在目标表中粘贴5次,然后替换一些 文本。
    • 同样,它会递增到最后一行。

    我得到了这个代码,我能够成功实现我的需要。问题是它是预定义的,所以每次我需要查看(基础工作表)并计算有多少SET,以及每个SET有多少行,那么我需要声明如下

    Dim seta As Range
    Dim setb As Range
    Dim setc As Range   
    Set seta = Sheet1.Range("A1:C3")
    Set setb = Sheet1.Range("A4:C5")
    Set setc = Sheet1.Range("A6:C9")
    

    可以由用户定义吗?我的意思是当用户在基础表中输入数据时,每个SET中有多个SET和多行。 VBA应该计算有多少SET,以及每个SET中有多少行,它应该动态地声明" seta"," setb",#34; setc"等等,作为范围对象。

    我知道它很长很混乱,但请不要理解我糟糕的问卷调查技巧,如果需要进一步的信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

您可以自动识别设置更改,而不是让用户定义它们。

看看这段代码:

Option Base 1
Dim sets(3) As Range,i as Integer,row as Integer,set_row as Integer
row =1
set_row=1
i=1
While ((Range("A" & row)<>"") And (i<=3))
    If ((Range("D" & row) <> Range("D" & set_row)) And (Range("D" & row)<>"")) Then
        Set sets(i)=Sheet1.Range("A"& set_row &":C" & (row-1))
        set_row=row
        i=i+1
    End If
    row=row+1
Wend

答案 1 :(得分:0)

您可以创建一个可以将设置名称传递给的函数,它将返回该集合的范围(假设名称在ColD中找到)

Sub Tester()

    Dim rng As Range, s As String

    s = "SETB"
    Set rng = GetSetRange(s)
    If Not rng Is Nothing Then
        Debug.Print s & " = " & rng.Address(False, False)
    Else
        Debug.Print "Set '" & s & "' not found!"
    End If

End Sub



Function GetSetRange(setName As String) As Range
    Dim rv As Range, f As Range, sht As Worksheet
    Dim i As Long
    Set sht = ThisWorkbook.Worksheets("Base Sheet")
    Set f = sht.Columns(4).Find(setName, lookat:=xlWhole)
    If Not f Is Nothing Then
        Set rv = f.EntireRow.Cells(1).Resize(1, 3)
        i = 1
        Do While Application.CountA(rv.Offset(i, 0)) > 0 And _
                 Len(f.Offset(i, 0)) = 0
            i = i + 1
        Loop
        Set rv = rv.Resize(i, 3)
    End If
    Set GetSetRange = rv
End Function