Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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 excel双循环条件_Vba_Excel - Fatal编程技术网

VBA excel双循环条件

VBA excel双循环条件,vba,excel,Vba,Excel,我目前在excel vba中工作,尽管我的编程很糟糕。我想执行以下功能。我有两个数据范围: 一个范围(a1:a10)是指需要对照另一个范围(b1:b250)检查的变量。变量检查的条件应该是,如果变量较小(),则无需任何循环即可进行检查。SQL查询适用于您。以下是如何执行此操作 Sub tadaaa() Dim con As Object, rs As Object Dim query As String, query1 As String Dim connector As String Dim

我目前在excel vba中工作,尽管我的编程很糟糕。我想执行以下功能。我有两个数据范围:


一个范围(a1:a10)是指需要对照另一个范围(b1:b250)检查的变量。变量检查的条件应该是,如果变量较小(),则无需任何循环即可进行检查。SQL查询适用于您。以下是如何执行此操作

Sub tadaaa()

Dim con As Object, rs As Object
Dim query As String, query1 As String
Dim connector As String
Dim address As String
Dim sht As Worksheet
    Set sht = Sheets("Sheet1")


    Set con = CreateObject("adodb.connection")
    Set rs = CreateObject("adodb.recordset")

    address = ThisWorkbook.FullName

    connector = "provider=microsoft.ace.oledb.12.0;data source=" & _
             address & ";extended properties=""Excel 12.0 Macro;hdr=yes"""

    con.Open connector


    query = "select Defender from [sheet1$] where Defender < "
                            'Source sheet

    For i = 2 To sht.Range("b" & Rows.Count).End(xlUp).Row

        query1 = query & sht.Cells(i, 2).Value

        Set rs = con.Execute(query1) 'Execute the query

        'Recording query results to any sheet you want.
        sht.Cells(6500, 2 * i).End(3).Offset(1, 0).CopyFromRecordset rs

        sht.Cells(1, 2 * i).Value = rs.Fields(0).Name & " vs A" & i

        Set rs = Nothing

        query1 = Empty

    Next


Set con = Nothing


End Sub
Sub-tadaaa()
尺寸con作为对象,rs作为对象
Dim查询为字符串,query1为字符串
将连接器变暗为字符串
作为字符串的Dim地址
将sht变暗为工作表
设置sht=板材(“板材1”)
Set con=CreateObject(“adodb.connection”)
Set rs=CreateObject(“adodb.recordset”)
地址=ThisWorkbook.FullName
connector=“provider=microsoft.ace.oledb.12.0;data source=“&_
地址&“扩展属性=”“Excel 12.0宏;hdr=yes”“”
con.开路连接器
query=“从[sheet1$]中选择Defender,其中Defender<”
'来源表
对于i=2到短小范围(“b”和Rows.Count).End(xlUp).Row
query1=查询和短单元格(i,2).值
设置rs=con.Execute(query1)'执行查询
'将查询结果记录到所需的任何工作表。
短单元格(6500,2*i)。结束(3)。偏移量(1,0)。从记录集复制
单元格(1,2*i).Value=rs.Fields(0).Name&“vs A”&i
设置rs=无
query1=空
下一个
设置con=Nothing
端接头
这是我的初始工作表。你的B值在A列,A值在B列。

这是后面的vba代码


您可以在不使用任何循环的情况下执行此操作。SQL查询适用于您。以下是如何执行此操作

Sub tadaaa()

Dim con As Object, rs As Object
Dim query As String, query1 As String
Dim connector As String
Dim address As String
Dim sht As Worksheet
    Set sht = Sheets("Sheet1")


    Set con = CreateObject("adodb.connection")
    Set rs = CreateObject("adodb.recordset")

    address = ThisWorkbook.FullName

    connector = "provider=microsoft.ace.oledb.12.0;data source=" & _
             address & ";extended properties=""Excel 12.0 Macro;hdr=yes"""

    con.Open connector


    query = "select Defender from [sheet1$] where Defender < "
                            'Source sheet

    For i = 2 To sht.Range("b" & Rows.Count).End(xlUp).Row

        query1 = query & sht.Cells(i, 2).Value

        Set rs = con.Execute(query1) 'Execute the query

        'Recording query results to any sheet you want.
        sht.Cells(6500, 2 * i).End(3).Offset(1, 0).CopyFromRecordset rs

        sht.Cells(1, 2 * i).Value = rs.Fields(0).Name & " vs A" & i

        Set rs = Nothing

        query1 = Empty

    Next


Set con = Nothing


End Sub
Sub-tadaaa()
尺寸con作为对象,rs作为对象
Dim查询为字符串,query1为字符串
将连接器变暗为字符串
作为字符串的Dim地址
将sht变暗为工作表
设置sht=板材(“板材1”)
Set con=CreateObject(“adodb.connection”)
Set rs=CreateObject(“adodb.recordset”)
地址=ThisWorkbook.FullName
connector=“provider=microsoft.ace.oledb.12.0;data source=“&_
地址&“扩展属性=”“Excel 12.0宏;hdr=yes”“”
con.开路连接器
query=“从[sheet1$]中选择Defender,其中Defender<”
'来源表
对于i=2到短小范围(“b”和Rows.Count).End(xlUp).Row
query1=查询和短单元格(i,2).值
设置rs=con.Execute(query1)'执行查询
'将查询结果记录到所需的任何工作表。
短单元格(6500,2*i)。结束(3)。偏移量(1,0)。从记录集复制
单元格(1,2*i).Value=rs.Fields(0).Name&“vs A”&i
设置rs=无
query1=空
下一个
设置con=Nothing
端接头
这是我的初始工作表。你的B值在A列,A值在B列。

这是后面的vba代码


感谢阿里SM展示了一种优秀但鲜为人知的方式! 在Ali之前,我会多建议一种无循环方法:

Sub WithoutLoop()

Range("E1").FormulaR1C1 = "=""Vs Examiner ""&OFFSET(R2C2,COLUMN()-5,0)"
Range("E2").FormulaR1C1 = "=IF(OFFSET(R2C2,COLUMN()-5,0)<RC4,OFFSET(R2C2,COLUMN()-5,0),0)"
Range("E1").Copy
Range("E1", Range("E1").Offset(0, 9)).PasteSpecial xlPasteFormulas
Range("E2").Copy
Range("E2", Range("E2").Offset(2500, 9)).PasteSpecial xlPasteFormulas

End Sub
subwithoutloop()
范围(“E1”)。公式1c1=“=”与检查者“&偏移量(R2C2,列()-5,0)”

Range(“E2”).FormulaR1C1=“=IF(偏移量(R2C2,COLUMN()-5,0)感谢Ali SM展示了一种优秀但鲜为人知的方法! 在Ali之前,我会多建议一种无循环方法:

Sub WithoutLoop()

Range("E1").FormulaR1C1 = "=""Vs Examiner ""&OFFSET(R2C2,COLUMN()-5,0)"
Range("E2").FormulaR1C1 = "=IF(OFFSET(R2C2,COLUMN()-5,0)<RC4,OFFSET(R2C2,COLUMN()-5,0),0)"
Range("E1").Copy
Range("E1", Range("E1").Offset(0, 9)).PasteSpecial xlPasteFormulas
Range("E2").Copy
Range("E2", Range("E2").Offset(2500, 9)).PasteSpecial xlPasteFormulas

End Sub
subwithoutloop()
范围(“E1”)。公式1c1=“=”与检查者“&偏移量(R2C2,列()-5,0)”

Range(“E2”).FormulaR1C1=“=IF(OFFSET(R2C2,COLUMN()-5,0)您尝试过一些代码吗?您尝试过的代码示例将让我们为您提供更多有用的提示。(本论坛中有几个代码示例将为这个问题提供一个很好的起点)如果您不关心范围b1:b250的顺序,您可以对该范围进行排序,然后只比较最小的值。这将为您节省大量时间。如果您关心该范围的顺序,请先将其复制到某个临时列。您是否尝试过一些代码?您尝试过的代码示例将允许我们为您提供更多有用的指针。(本论坛中有几个代码示例将为这个问题提供一个良好的起点)如果您不关心范围b1:b250的顺序,您可以对该范围进行排序,然后只比较最小的值。这将为您节省大量时间。如果您关心该范围的顺序,请先将其复制到某个临时列中。谢谢,尽管“a=Application.Min(范围(“b1:B255”)”有一个错误-运行时错误“6”,溢出。我上面使用的示例只是为了解释逻辑。变量a正在检查的值有5218936个值。此外,如果变量大于该值,那么它应该按原样吐出变量,我不相信这已经包含在您的代码中?因此我设法解决了错误,在小数点后,我将“Dim a As Long”改为“Dim a As Long”而不是整数。虽然代码没有遍历B1:255的所有值,但只遍历前10行项目。我需要它遍历或检查所有255个值。请协助。代码找到B1:255上的最小值并将其分配给“a”。然后在问题中,您说,范围(“a”)上有10个数据。这就是它仅比较10个数字的原因。您可以将循环10上的数字更改为所需的任何数字。应将10个数字中的每个数字与B1:B255范围内的每个值进行检查。因此,循环为10x255=2550,其中不仅有10个值会像代码中的那样输出。可能有2000个输出,其中A1:A中的任何值都会包含10大于B1:B255。例如,A1可以大于B4、B6、B200和B224,其中一个已检查的值需要提供4个输出。现在我明白了。很抱歉,我之前没有完全理解。因此我认为您可以使用ADO SQL连接来消除所有循环。谢谢您,尽管“a=Application.Min(Range(”B1:B255“)”-运行时错误“6”,溢出。我上面使用的示例只是为了解释lo