Vba 如何添加每个项目23属性
我不知道如何更好地描述我的问题。下面是一个例子: 我在一个电子表格中有两个选项卡:“A”和“B”。工作表A有一个项目列表,只有一列,但行数可能会更改 然后表B有23行数据。在这个例子中,我并没有把23行都写下来 我想把A和B结合起来,使A中的每一项在B中都有23行属性。如下所示:Vba 如何添加每个项目23属性,vba,excel,Vba,Excel,我不知道如何更好地描述我的问题。下面是一个例子: 我在一个电子表格中有两个选项卡:“A”和“B”。工作表A有一个项目列表,只有一列,但行数可能会更改 然后表B有23行数据。在这个例子中,我并没有把23行都写下来 我想把A和B结合起来,使A中的每一项在B中都有23行属性。如下所示: 由于工作表a可以有1k+行,如何使用宏执行此操作?对于VBA,解决方案如下: Sub adding() Dim Arr1 As Variant, Arr2 As Variant Dim runner1 A
由于工作表a可以有1k+行,如何使用宏执行此操作?对于VBA,解决方案如下:
Sub adding()
Dim Arr1 As Variant, Arr2 As Variant
Dim runner1 As Variant, runner2 As Variant
Dim i As Long
Arr1 = Sheets(1).Range("A1:A25").Value
Arr2 = Sheets(2).Range("A1:A25").Value
i = 1
For Each runner1 In Arr1
For Each runner2 In Arr2
Sheets(3).Cells(i, 1).Value = runner1
Sheets(3).Cells(i, 2).Value = runner2
i = i + 1
Next
Next
End Sub
它的作用是:
- 它循环第一个范围内的所有项目
- 在每个循环中,它循环第二个范围中的所有项目
- 在每个循环中,它将第一个循环的实际值添加到第一列
- 它还将第二个循环的当前值添加到第二列
- 然后它向上计数
,在下一行中插入下一个值i
- 在每个循环中,它循环第二个范围中的所有项目
编辑:
正如评论中所写的那样,这不是最好的方法,但在我看来,这是最容易克服的方法。您可能希望/需要执行的所有更改:
是包含第一项的工作表(您可以将其更改为Sheets(1)
或任何您想要/需要的内容Sheets(“A”)
是包含第二项的工作表(您可以将其更改为工作表(“B”)`或您想要/需要的任何内容)Sheets(2)
是打印长列表的表单(您可以将其更改为Sheets(“C”)或您想要/需要的任何内容)Sheets(3)
用于写入行,在开始处设置i
以将第一行作为输出的开始四(您可以将其更改为i=1
以从第二行开始,或者将其更改为您想要/需要的另一个数字)i=2
forRange(“A1:A25”)
和Arr1
设置从中获取数据的范围(您可以将其更改为Arr2
或任何您想要/需要的。它们也不需要相同)Range(“A2:A24”)
和runner1
的runner2
单元格(i,x)(x
是代码中的1和2)告诉您列表中的项目将在哪一列打印(如果您想/需要,请将其更改为不同的数字)x
- 有3个或更多列表,您只需将
,Arr3
,…和Arr4
,runner3
,…添加到代码中,然后为Arr3中的每个runner3,runner4
为Arr4中的每个runner4添加
。。。(不要忘了为每个
的
设置一个
下一个
,并为每个
运行程序设置一个输出
)
只是为了好玩,没有VBA的解决方案:
(为了更好地理解,我缩短了代码) 第3页中的单元格
A2
:
=INDEX(Sheet1!A:A,ROUNDUP((ROW()-1)/$C$1,0)+1)
=INDEX(Sheet2!A:A,MOD(ROW()-2,$C$1)+2)
=MAX(IF(ISNUMBER(MATCH({"",-1E+307},Sheet2!A:A,-1)),MATCH({"",-1E+307},Sheet2!A:A,-1)))-1
此代码将Sheet1
中的每个项目重复x次(1,1,1,2,2,3,3,…),而x是C1
的值-1
表示您不用于输出的行。从第二行开始,将漏掉1(-1
),而从第15行开始,将漏掉14(-14
)+1
表示要在源代码处跳过的行(将源代码从第二行开始将导致+1
,从第九行开始将是+8
)
第3页中的单元格B2:
=INDEX(Sheet1!A:A,ROUNDUP((ROW()-1)/$C$1,0)+1)
=INDEX(Sheet2!A:A,MOD(ROW()-2,$C$1)+2)
=MAX(IF(ISNUMBER(MATCH({"",-1E+307},Sheet2!A:A,-1)),MATCH({"",-1E+307},Sheet2!A:A,-1)))-1
此代码无休止地重复整个第二个列表(1,2,3,1,2,3,1,2,3,…)(仅针对您输入公式的范围)-2
和+2
与第一个公式中的相同。但是,每一个都增加了1(或减少了负数部分)。从第四行开始输出的负数部分也是-4
,从第六行开始的源代码为正数部分提供+6
第3页中的单元格C1
:
=INDEX(Sheet1!A:A,ROUNDUP((ROW()-1)/$C$1,0)+1)
=INDEX(Sheet2!A:A,MOD(ROW()-2,$C$1)+2)
=MAX(IF(ISNUMBER(MATCH({"",-1E+307},Sheet2!A:A,-1)),MATCH({"",-1E+307},Sheet2!A:A,-1)))-1
此代码只搜索Sheet2!A:A
中的最后一个单元格,该单元格不是空的,而是从第二行开始(第1行只是一个标题),最后是-1,表示列表中的项目数量。但是,填充列表下方的单元格也会对其进行计数(包括介于之间的所有空单元格)因此,您可以将其更改为Sheet2!$A$2:$A$50
(从第一项开始时,您需要删除结尾处的-1
。如果您不想为此增加一个额外的单元格,只需用此代码替换
$C$1
(没有=
,如果末尾有-1
,或者无法正常工作,也可以将其放在A2
中代码的大括号中()
。您还需要根据需要更改工作表名称(
Sheet1
、Sheet2
、Sheet3
)和单元格范围
然后简单地自动填充,直到A列只显示“0”(B列将无休止地循环)是非常动态的,因为每次更改都会放在输出中。(这也可能有缺点)对于很长的列表,最好将其与额外的单元格
C1
(或任何您想要的单元格)一起使用,并且在前两个单元格中不包括第三个代码
玩得开心:)使用VBA,解决方案如下:
Sub adding()
Dim Arr1 As Variant, Arr2 As Variant
Dim runner1 As Variant, runner2 As Variant
Dim i As Long
Arr1 = Sheets(1).Range("A1:A25").Value
Arr2 = Sheets(2).Range("A1:A25").Value
i = 1
For Each runner1 In Arr1
For Each runner2 In Arr2
Sheets(3).Cells(i, 1).Value = runner1
Sheets(3).Cells(i, 2).Value = runner2
i = i + 1
Next
Next
End Sub
它的作用是:
- 它循环第一个范围内的所有项目
- 在每个循环中,它循环第二个范围中的所有项目
- 在每个循环中,它将第一个循环的实际值添加到第一列
- 它还将第二个循环的当前值添加到第二列
- 然后它向上计数
,在下一行中插入下一个值i
- 在每个循环中,它循环第二个范围中的所有项目
编辑:
正如评论中所写的,这不是最好的方法,但最容易反驳(在我看来)