Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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
Excel 为什么使用VBA for循环无法获得完整结果_Excel_Vba - Fatal编程技术网

Excel 为什么使用VBA for循环无法获得完整结果

Excel 为什么使用VBA for循环无法获得完整结果,excel,vba,Excel,Vba,在上面的excel文件中,我希望第1列中的每个单词(总共12个)和第2列中的每个单词(总共4个)组合成第3列中生成的短语。我应该得到12*4=48个短语。使用下面我写的代码,只有不到30个有空值单元格。请告诉我为什么我到不了48岁。多谢各位 Sub WordsCombiner() For i = 1 To 12 For m = 1 To 4 Cells(i * m, 3).Value = Cells(i, 1).Value + Cells(m, 2

在上面的excel文件中,我希望第1列中的每个单词(总共12个)和第2列中的每个单词(总共4个)组合成第3列中生成的短语。我应该得到12*4=48个短语。使用下面我写的代码,只有不到30个有空值单元格。请告诉我为什么我到不了48岁。多谢各位

Sub WordsCombiner()
    For i = 1 To 12
        For m = 1 To 4
            Cells(i * m, 3).Value = Cells(i, 1).Value + Cells(m, 2).Value
        Next
    Next
End Sub
原文如下:

(第一栏)

第二列

请尝试以下方法:

Sub WordsCombiner()

    Dim i As Long
    For i = 1 To 12

        Dim j As Long
        For j = 1 To 4

            Dim k As Long
            k = k + 1
            Cells(k, 3).Value = Cells(i, 1).Value & " " & Cells(j, 2).Value
        Next
    Next

End Sub

这是动态的,因此它将针对
列A
列B
中的每个值运行。它还广告分组之间的空间,如您在输出中所示

lra=最后一行第a列
lrb=最后一行第b列
i=c列的计数器

子联合收割机()
将ws设置为工作表:设置ws=ThisWorkbook.Sheets(“Sheet1”)
变暗lra为长,lrb为长,a为长,b为长
长度为的尺寸i:i=1
lra=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
lrb=ws.Range(“B”&ws.Rows.Count).End(xlUp).Row
对于b=1至lrb
对于a=1至lra
ws.Range(“C”和i)=ws.Range(“A”和A)和Chr(32)以及ws.Range(“B”和B)

i=i+1'分配结果行的逻辑错误。当你有
i*m
时,你会得到“从时间”和“as”的值,因为1*2和2*1都=2。使用单独的计数器变量或更改表达式。解决这个问题的最佳方法是定义三组值和它们应该是的行,并找到适合的行。

我更喜欢SQL来完成这个任务

选择
t1.Col1、t2.col2、t1.Col1&&t2.col2
从…起
(从[Sheet1$]中选择col1,其中col1不为空)作为t1,
(从[Sheet1$]中选择col2,其中col2不为空)作为t2
该查询创建两列的carthesian乘积-

结果包含列1和列2的所有组合。。如果列包含重复项,并且您不希望重复结果,只需使用

选择不同的t1.col1&&t2.col2作为结果。。。
为了摆脱他们

下面是一个例子,让downvoter和Looper相信SQL在处理数据时的简单优点:

Private Sub-ComputeCarthesianProduct()
将sql设置为字符串
sql=“选择t1.[F1]和“”&t2.[F2]作为源的结果”_
&(从[Sheet1$]中选择[F1],其中[F1]不为空)作为t1_
&“(从[Sheet1$]中选择[F2],其中[F2]不为空)作为t2”
调试.打印sql
作为对象的Dim con
Set con=CreateObject(“ADODB.Connection”)
带着骗局
.Open“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“&ThisWorkbook.FullName&”扩展属性=“”Excel 12.0 Xml;Imex=1;HDR=no”“
将遥感器作为对象
Set rs=CreateObject(“ADODB.Recordset”)
用rs
.打开sql,con
Sheet1.范围(“C1”)。CopyFromRecordset rs’Sheet1是工作表的代号(“Sheet1”)。显式引用,不会重命名工作表
.结束
以
.结束
以
端接头

如果您仍然喜欢为每列嵌套一个循环,那么您应该感到头晕目眩;)

这是因为
单元格(i*m,3)。Value
Oh没有注意到字符串连接的问题-修复得好。很好的清晰答案,尽管我有点想编辑它,将
Dim
放在循环之外0始终在使用变量之前声明变量,这样您就可以知道何时开始使用它们;)当您处理数百行代码或省略选项显式时,它非常有用,因此无需麻烦:pI assum每个模块都有一个自动的
选项显式
声明。如果不是,那么至少我提供的代码不会因为变量而失败……当然,你应该这样做。这里有一个答案是不是很严肃地建议不要使用Option Explicit而不进行编辑,并且作者会受到公众的羞辱?我不明白为什么会被否决。这类查询在excel文件中非常快速和有用
as 
time 
of 
publication
Sub WordsCombiner()

    Dim i As Long
    For i = 1 To 12

        Dim j As Long
        For j = 1 To 4

            Dim k As Long
            k = k + 1
            Cells(k, 3).Value = Cells(i, 1).Value & " " & Cells(j, 2).Value
        Next
    Next

End Sub
Sub Combine()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")

Dim lra As Long, lrb As Long, a As Long, b As Long
Dim i As Long: i = 1

lra = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
lrb = ws.Range("B" & ws.Rows.Count).End(xlUp).Row

For b = 1 To lrb

    For a = 1 To lra
        ws.Range("C" & i) = ws.Range("A" & a) & Chr(32) & ws.Range("B" & b)
        i = i + 1 '<--Next Row on Column C
    Next a

    i = i + 1 '<--Add Space Between Groupings 

Next b


End Sub