如何迭代Excel / VBA中的一系列单元格?

问题描述 投票:0回答:1
Dim works As Worksheet
Set works = ThisWorkbook.Sheets("Sheet1")
Dim txt As Variant

myrange = works.Range("C1:C9")

For Each txt In myrange
        If InStr(1, txt, "£", vbTextCompare) > 0 Then
            Debug.Print txt.Value                    '<..Object required err
            Debug.Print works.Range("C" & txt).Value '<..Object required err
            Debug.Print works.Cells(txt, 1).Value    '<..Object required err
            Debug.Print txt.Offset(0, 1).Value       '<..Object required err

    End If

Next txt

我试图获取包含“£”的单元格的值,然后将其删除。在任何情况下我都会得到`对象定义的错误。我尝试了3种不同的选项,但仍然出现错误。我是VBA的新手,还在学习。我该如何解决这个问题,为什么我会收到错误?

vba loops for-loop
1个回答
1
投票

一个问题是线myrange = works.Range("C1:C9")。它之前应该有Set,如:

Set myrange = works.Range("C1:C9")

这样,您可以确保进行引用分配,而不是赋值。没有它,你告诉VBA你希望单元格的值放在变量中。有了它,你告诉VBA你希望你的变量指向那个范围。

由于你没有明确地将myrange声明为Range对象,因此VBA隐式地将其声明为Variant并将其视为String。所以,在循环中,txt也是一个String,而不是你所期望的Range。因此你的错误。

如果你在开始时有Dim myrange As Range,那么没有Set的任务就会失败,你就会立即修复它。

但是有一个简单的习惯可以防止这种错误:在模块的顶部插入Option Explicit。这样,你必须明确声明所有变量,这意味着VBA不会假设它们是Variant

你甚至可以通过检查Tools > Options中的相关选项来自动完成。

© www.soinside.com 2019 - 2024. All rights reserved.