Excel VBA获取范围

时间:2017-06-30 21:40:55

标签: excel vba 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

1 个答案:

答案 0 :(得分:2)

1-除非您有特定原因,否则请始终使用Long作为变量,而不是IntegerInteger的最大值为 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并尝试始终使用限定范围。