vba - Excel VBA - 寻找简化循环的方法

标签 vba excel foreach

我最近做了一个循环,它在每个单元格中获取字符串,在字符串中搜索一个“_”,如果有一个则切断该位及其后面的任何字符。看着代码,我意识到它可能太复杂了,可以缩短或简化,但我不太确定该怎么做。有没有办法让这段代码更有效率?

Sub Name_Change()

Sheets("Sheet1").Activate

Dim tg_row As Integer
tg_row = 1

For Each nm_cl In Range("Table1[Name]")
    If InStr(1, nm_cl, "_", vbTextCompare) = 0 Then
        Range("Table1[Name]").Cells(tg_row, 1).Value = nm_cl.Value
    Else
        Range("Table1[Name]").Cells(tg_row, 1) = _
                Left(nm_cl, InStr(1, nm_cl, "_", vbTextCompare) - 1)
    End If
    tg_row = tg_row + 1
Next nm_cl

End Sub

谢谢您的帮助!

最佳答案

对此进行优化的第一次尝试是注意您正在调用 InStr。多次。您可以通过计算一次并存储结果来加快速度。

除此之外,我会注意到大概 Range("Table1[Name]")只有一列(否则您将用其他列的数据覆盖第一列)。因此,您可以替换 Range("Table1[Name]").Cells(tg_row, 1)nm_cl .在此过程中,我们注意到 nm_cl.Value = nm_cl.Value 的冗余语句可以删除。这导致以下代码:

Sub Name_Change()

Sheets("Sheet1").Activate

Dim index As Long

For Each nm_cl In Range("Table1[Name]")
    index = InStr(1, nm_cl, "_", vbTextCompare)
    If index <> 0 Then
        nm_cl = Left(nm_cl, index - 1)
    End If
Next nm_cl

End Sub

如果您需要更高的效率,除此之外,您可以使用以下方法将数据加载到变体中
dim data as Variant
data = Range("Table1[Name]").Value

在 VBA 中处理所有数据,然后使用
Range("Table1[Name]").Value = data

这将提高您的速度,因为在 Excel 和 VBA 之间传输数据很慢,这意味着您将有 1 次读取和 1 次写入,而不是每行 1 次读取和 1 次写入,但它需要(轻微)重写您的算法为使用变体中的数组的语法与使用范围不同。请注意,如果超出 65536 行,这将不起作用。我相信这是 Excel 2003 及更早版本的遗留约束。

关于vba - Excel VBA - 寻找简化循环的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408659/

相关文章:

javascript - Angular.forEach 只返回一个结果?

javascript - Meteor forEach() 无法解释地改变传递的变量

php - 使用 PHP foreach - 如何为每行创建单独的 div?

excel - 复制粘贴图表 Excel VBA

excel - 使用 GrantAccessToMultipleFiles 阻止 Sub 在 Windows 上运行

c# - VSTO:如何强制 Visual Studio 运行 Excel 的新实例

excel - 用数据填充范围

sql-server - Excel Ms 查询上手动输入的数据刷新后未对齐

excel - 如何将多个文件加载到我的 Excel 工具中?

vba - 将某些 Excel 工作表导出为单独的 PDF 的宏