VBA,搜索具有特定值的行数
我是VBA新手,我想问代码有什么问题,我想获取所有行号并将其存储为数组。该行具有特定的要求,即在每行中,第一个单元格的第一个字母以开头 “B”VBA,搜索具有特定值的行数,vba,excel,Vba,Excel,我是VBA新手,我想问代码有什么问题,我想获取所有行号并将其存储为数组。该行具有特定的要求,即在每行中,第一个单元格的第一个字母以开头 “B” 要使数组包含第一个单元格中的值以“B”开头的所有行,可以使用如下子元素 代码中的问题: 选项Explicit应始终用于模块顶部-仅此语句就可以帮助您发现几个问题 Dim rowNum()As Variant是一个变量数组,而所需的只是一个long数组 Dim row As Integer-这将隐藏内置函数Range()。row 导致此行出现问题:
要使数组包含第一个单元格中的值以“B”开头的所有行,可以使用如下子元素
代码中的问题:
应始终用于模块顶部-仅此语句就可以帮助您发现几个问题选项Explicit
是一个变量数组,而所需的只是一个long数组Dim rowNum()As Variant
-这将隐藏内置函数Dim row As Integer
Range()。row
- 导致此行出现问题:
rowNum(计数器)=c.row
- 此外,所有整数数据类型都应替换为Long
- 导致此行出现问题:
- 带有工作簿的
-“工作簿”不是有效的对象
- 有效对象:“工作簿(i)”(打开文件的集合)、“活动工作簿”、“此工作簿”
无效,因为Set row=…
定义为整数row
- 对于基本数据类型,如Byte、Integer、Long,您可以直接赋值:
val=1
对于工作簿、工作表、范围、集合等对象类型是必需的Set
- 对于基本数据类型,如Byte、Integer、Long,您可以直接赋值:
不返回使用的行总数.Range(“A1”),.Range(“A1”).End(xlUp)).Count
表示A1是活动单元格,.Range(“A1”).End(xlUp)
类似于按下向上箭头,因此结果是活动单元格仍然是A1.End(xlUp)
- 这转换为
->.Range(“A1”、“A1”).Count
->.Range(第1行,第1列)。Count
1
- 要查找A列中的最后一行,请使用
Sheet1.Cells(Sheet1.Rows.Count,“A”).End(xlUp).row
是工作表上的最后一行(100多万)Sheet1.Rows.Count
- 因此,从单元格(Row=1048576,Col=“A”)按向上箭头键可到达包含数据的最后一个单元格
- 正如注释
未声明,也未初始化中指出的,rowN
- 行
失败,因为ReDim rowNum(1到rowN)
隐式创建为空变量rowN
- 行
未声明c
循环未关闭(For
缺失)Next
- 这样编写的If语句将只执行行
Counter=Counter+1
- If语句有两种形式:
- 一行:
(如果,则为否如果1=1,则为“单语句”,否则为“其他单行”
结束)
- 或者每个分支的一块语句,全部在单独的行上,如果,则以
结尾结束:
您的
ReDim
行上的rowN
是什么?rowN是当前工作表中使用的总行数,关于ADODB.RecordSet
?看这里。它可以被过滤和计数。非常感谢。我对VBA在很多方面感到困惑。有什么有用的指导书我可以看吗?不太清楚,我没有用过(我从这个网站学到了所有我知道的东西)。您还可以使用录音机,并使用该工具提供的广泛帮助-它解释了您需要了解的许多重要细节和概念。另外,当你尽了最大的努力无法克服这个问题时,可以在这里问更多的问题,但要使它们易于复制和测试,以便其他人能够帮助你。非常感谢你提出的所有建议。
Sub rowNum()
Dim rowNum() As Variant
Dim wbBook As Workbook
Dim wsSource As Worksheet
Dim wsTarget As Worksheet
Dim row As Integer
Dim Counter As Integer
Counter = 0
Set wbBook = ThisWorkbook
With Workbook
Set wsSource = .Worksheets("Sheet1")
Set wsTarget = .Worksheets("sheet2")
End With
With wsSource
Set row = .Range("A1", .Range("A1").End(xlUp)).Count
End With
ReDim rowNum(1 To rowN)
For Each c In wsSource.Range("A1:A" & rowN).Cells
If Left(c.Text, 1) = "B" Then Counter = Counter + 1
rowNum(Counter) = c.row
End If
End Sub
Option Explicit
Public Sub GetRows()
Dim colA As Variant, rowArr() As Long, ub As Long, i As Long, j As Long, val As String
colA = Sheet1.UsedRange.Columns("A").Value2
ub = UBound(colA)
ReDim rowArr(1 To ub)
j = 1
For i = 1 To ub
val = Trim(colA(i, 1))
If Len(val) > 0 Then
'to ignore case use: If LCase(Left(val, 1)) = "b" Then
If Left(val, 1) = "B" Then
rowArr(j) = i
j = j + 1
End If
End If
Next
ReDim Preserve rowArr(1 To j - 1)
End Sub
If 1 = 1 Then
statement 1
statement 2
etc
Else
statement 3
statement 4
etc
End If