我知道这已被问到至少十几次,但在所有这些问题中,解决方案似乎都是量身定制的,或者只是在我的代码中创建了一个错误。出于某种原因,当我尝试从不同的工作表中引用范围时,我收到错误。以下是我的代码。我有两个工作表(标签)。一个按钮用于启动我的代码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
答案 0 :(得分:2)
1-除非您有特定原因,否则请始终使用Long
作为变量,而不是Integer
。 Integer
的最大值为 32767 ,这可能不足以保存您的行数。
2-不要使用COUNTA
获取行数,这有许多缺点。请改用:
siteCol = wsCurrent.Range("I" & wsCurrent.Rows.count).End(xlUp).Row
这会在wsCurrent
中找到最后一个被占用单元格的行号,假设wsCurrent
位于文档的顶部(从第1行开始)。请注意,如果wsCurrent完全为空,则会找到 wsCurrent
上方第一个被占用单元格的行号,或文档的第一行。
3-如果要将整个范围分配给相同的值,可以立即执行,这样更快更简单,就像这样(不需要循环):
wsCurrent.Range("I1:I" & siteCol) = "MARKED"
4-无需Activate
工作表即可使用它。删除语句wsCurrent.Activate
并尝试始终使用限定范围。