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
Excel 如何选择工作表中的特定行_Excel_Vba - Fatal编程技术网

Excel 如何选择工作表中的特定行

Excel 如何选择工作表中的特定行,excel,vba,Excel,Vba,我有一个很大的excel文件,我想将所有信息从工作表传输到变量 我不需要文件中的所有行,所以我想选择我感兴趣的行 我曾尝试使用Union来选择我感兴趣的行,从而生成复杂的范围变量 问题是,如果有用的信息被不需要的行除以,我的程序就不会增加范围 例如: 我有这样的桌子: 123|1|1|1 123|2|2|2 456|3|3|3 123|4|4|4 我希望第一列中有123行,但我使用的是Union函数,我只得到了前两行,但没有第四行 我需要: 123|1|1|1 123|2|2|2 123|4|

我有一个很大的excel文件,我想将所有信息从工作表传输到变量

我不需要文件中的所有行,所以我想选择我感兴趣的行

我曾尝试使用Union来选择我感兴趣的行,从而生成复杂的范围变量

问题是,如果有用的信息被不需要的行除以,我的程序就不会增加范围

例如: 我有这样的桌子:

123|1|1|1
123|2|2|2
456|3|3|3
123|4|4|4
我希望第一列中有123行,但我使用的是Union函数,我只得到了前两行,但没有第四行

我需要:

123|1|1|1
123|2|2|2
123|4|4|4
但请接受:

123|1|1|1
123|2|2|2
下面是我代码的一部分。这部分在循环中

r范围

WS-工作表

Set r = WS.Range("A1:A1")
有人能帮我吗。我已经找了一个小时的解决方案了

If WS.Cells(i, 1).Value = "123" Then
    If r.Columns.Count() < 2 Then
        Set r = WS.Range(WS.Cells(i, 1), WS.Cells(i, 4))
    Else
        Set r = Union(r, WS.Range(WS.Cells(i, 1), WS.Cells(i, 4)))
    End If
End If
如果WS.Cells(i,1).Value=“123”那么
如果r.Columns.Count()小于2,则
设置r=WS.Range(WS.Cells(i,1),WS.Cells(i,4))
其他的
Set r=Union(r,WS.Range(WS.Cells(i,1),WS.Cells(i,4)))
如果结束
如果结束

使用您的方法,这是可行的:

Sub x()

Dim r As Range, ws As Worksheet, i As Long
Dim j As Long

Set ws = ActiveSheet
Set r = ws.Range("A1")

For i = 1 To 4
    If ws.Cells(i, 1).Value = 123 Then
        If r.Columns.Count < 2 Then
            Set r = ws.Range(ws.Cells(i, 1), ws.Cells(i, 4))
        Else
            Set r = Union(r, ws.Range(ws.Cells(i, 1), ws.Cells(i, 4)))
        End If
    End If
Next i

For j = 1 To r.Areas.Count
    Range("G" & Rows.Count).End(xlUp)(2).Resize(r.Areas(j).Rows.Count, r.Areas(j).Columns.Count).Value = r.Areas(j).Value
Next j

End Sub

按所需值过滤第一列如何?也许你根本不需要VBA。这可能只需点击几下Power Query就可以完成,而无需编写任何VBA。这可以工作,但只是拾取某些行不就慢了吗?这对我来说非常重要,因为我有两个大文件,我想尽我所能优化我的程序。过滤是一种方法。您没有说明如何返回
r
。您可能需要循环遍历它的区域,因为它不是连续的。那么,过滤它就是了。我不想过滤,但我猜,这是一种方式…正如他们在上面告诉你的那样,过滤是一种方式,只是因为过滤将执行一次,而试图通过循环一个大文件来构建一个范围将花费大量时间。过滤数据后,您可以使用
SpecialCells(xlCellTypeVisible)
构建范围。不要尝试将过滤后的数据拉入
变量中,因为它不起作用。谢谢。但我需要将信息传递给变量。不在excel文件中。有没有办法做到这一点?我这样做,但没有结果:temp=r.ValueAn数组?那么为什么不通过阵列来实现呢?如何实现?我的意思是,我曾尝试使用ReDim Preserve,但没有得到任何好的结果。(我是VBA新手,所以我的代码有很多问题)上面编辑的答案。
Sub x()

Dim ws As Worksheet, i As Long, j As Long, v As Variant, v2() As Variant

v = Range("A1:D4").Value

ReDim Preserve v2(1 To UBound(v, 1), 1 To UBound(v, 2))

For i = LBound(v, 1) To UBound(v, 1)
    If v(i, 1) = 123 Then
        j = j + 1
        v2(j, 1) = v(i, 1)
        v2(j, 2) = v(i, 2)
        v2(j, 3) = v(i, 3)
        v2(j, 4) = v(i, 4)
    End If
Next i

Range("G1").Resize(j, UBound(v2, 2)).Value = v2

End Sub