VBA,搜索具有特定值的行数

VBA,搜索具有特定值的行数,vba,excel,Vba,Excel,我是VBA新手,我想问代码有什么问题,我想获取所有行号并将其存储为数组。该行具有特定的要求,即在每行中,第一个单元格的第一个字母以开头 “B” 要使数组包含第一个单元格中的值以“B”开头的所有行,可以使用如下子元素 代码中的问题: 选项Explicit应始终用于模块顶部-仅此语句就可以帮助您发现几个问题 Dim rowNum()As Variant是一个变量数组,而所需的只是一个long数组 Dim row As Integer-这将隐藏内置函数Range()。row 导致此行出现问题:

我是VBA新手,我想问代码有什么问题,我想获取所有行号并将其存储为数组。该行具有特定的要求,即在每行中,第一个单元格的第一个字母以开头 “B”


要使数组包含第一个单元格中的值以“B”开头的所有行,可以使用如下子元素



代码中的问题:

  • 选项Explicit
    应始终用于模块顶部-仅此语句就可以帮助您发现几个问题
  • Dim rowNum()As Variant
    是一个变量数组,而所需的只是一个long数组
  • Dim row As Integer
    -这将隐藏内置函数
    Range()。row
    • 导致此行出现问题:
      rowNum(计数器)=c.row
    • 此外,所有整数数据类型都应替换为Long
  • 带有工作簿的
    -“工作簿”不是有效的对象
    
    • 有效对象:“工作簿(i)”(打开文件的集合)、“活动工作簿”、“此工作簿”
  • Set row=…
    无效,因为
    row
    定义为整数
    • 对于基本数据类型,如Byte、Integer、Long,您可以直接赋值:
      val=1
    • Set
      对于工作簿、工作表、范围、集合等对象类型是必需的
  • .Range(“A1”),.Range(“A1”).End(xlUp)).Count
    不返回使用的行总数
    • .Range(“A1”).End(xlUp)
      表示A1是活动单元格,
      .End(xlUp)
      类似于按下向上箭头,因此结果是活动单元格仍然是A1
    • 这转换为
      .Range(“A1”、“A1”).Count
      ->
      .Range(第1行,第1列)。Count
      ->
      1
    • 要查找A列中的最后一行,请使用
      Sheet1.Cells(Sheet1.Rows.Count,“A”).End(xlUp).row
    • Sheet1.Rows.Count
      是工作表上的最后一行(100多万)
    • 因此,从单元格(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