我对VBA很新。实际上我的场景很复杂,所以让我先从一个例子开始,然后向你解释我到底需要什么。我将在excel中有三个工作表。
基础单
条件表
目的地表
基本表格将采用以下格式:
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"数据
我得到了这个代码,我能够成功实现我的需要。问题是它是预定义的,所以每次我需要查看(基础工作表)并计算有多少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"等等,作为范围对象。
我知道它很长很混乱,但请不要理解我糟糕的问卷调查技巧,如果需要进一步的信息,请告诉我。
答案 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