Excel VBA 获取范围内非空行的计数

xxS*_*exx 1 excel vba

我知道这个问题至少被问过十几次了,但在所有这些问题中,解决方案似乎都是量身定制的,或者只是在我的代码中创建了一个错误。由于某种原因,当我尝试引用不同工作表中的范围时出现错误。下面是我的代码。我有两个工作表(选项卡)。一个有一个按钮来启动我的代码MENU,另一个是我试图读取和写入的数据RAW。我想做的就是找出工作表有多少行数据,以便我可以循环遍历这些行并进行更改。由于某种原因,我无法理解它或其他什么。

Private Sub CommandButton21_Click()
  Dim wbCurrent As Workbook
  Dim wsCurrent As Worksheet

  Set wbCurrent = ThisWorkbook
  Set wsCurrent = wbCurrent.Worksheets("RAW")

  Dim i As Long
  Dim siteCol As Long

  siteCol = Range("I" & Rows.Count).End(xlUp).Row
  For i = 1 To siteCol
    wsCurrent.Range("I" & i) = "MARKED"
  Next i
  Range("I1") = siteCol
End Sub
Run Code Online (Sandbox Code Playgroud)

A.S*_*S.H 5

1- 始终使用Long您的变量,除非Integer有特定原因。an 的最大值Integer32767,这可能不足以容纳您的行数。

2-不要使用 获取行数COUNTA,这有很多缺点。使用这个代替:

siteCol = wsCurrent.Range("I" & wsCurrent.Rows.count).End(xlUp).Row
Run Code Online (Sandbox Code Playgroud)

这将查找 中最后占用的单元格的行号wsCurrent,假设该wsCurrent单元格位于文档的顶部(从第 1 行开始)。请注意,如果 wsCurrent 完全为空,这将找到上面 第一个占用单元格的行号wsCurrent,或文档的第一行。

3-当您想要将整个范围分配给相同的值时,您可以立即执行此操作,这更快更简单,如下所示(无需循环):

wsCurrent.Range("I1:I" & siteCol) = "MARKED"
Run Code Online (Sandbox Code Playgroud)

4- 无需Activate工作表即可使用。删除该语句wsCurrent.Activate并尝试始终使用合格的范围。