Vba 哪一种更快,一个变量还是直接访问单元格值?

Vba 哪一种更快,一个变量还是直接访问单元格值?,vba,excel,Vba,Excel,我有很多像这样的字符串操作 1st one ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cells(i, "B").Value, ",", " ") ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cells(i, "B").Value, "/", " ") ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cell

我有很多像这样的字符串操作

1st one
ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cells(i, "B").Value, ",", " ")
ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cells(i, "B").Value, "/", " ")
ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cells(i, "B").Value, "&", " ")
ActiveSheet.Cells(i, "B").Value = Replace(ActiveSheet.Cells(i, "B").Value, "(", " ")
2nd one
store=ActiveSheet.Cells(i, "B").Value
store= Replace(store, "/", " ")
store = Replace(store, "&", " ")
store = Replace(store, "(", " ")
和一些修剪操作,有时查找字符串长度,有时比较

我必须为1号到4000号单元格做循环。问题是将单元格值存储在字符串中,访问是否更好更快?或者在宏中写入activesheet单元格值本身更快

store = activesheet.cells(i,"B").value and use store everywhere 
or write activesheet.cells(i,"B").value everywhere?

哪一个更好哪一个更优化我在想,如果我们提到单元格值,它必须转到工作表并取回,但如果我们将其存储在变量中,那么它可能会更快。我只想知道哪个更好?

访问Excel很慢。在一个变量中存储您将访问两次以上的内容通常会更快,而将一系列单元格(一次调用Excel)转储到一个变量数组中则更好

记住,Excel和VBA是不同的。就像两个男人在同一套公寓里,但房间不同。每次访问Excel时,VBA都必须敲Excel的门

更新: 以上是所有代码的一般建议。考虑到上面的特定代码和您正在做的事情,在以下范围内使用Excel的搜索和替换功能可能会更快:

Sub test()

Application.ScreenUpdating = False
With Range("B1:B4000")
    .Replace what:="(", replacement:=" ", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    .Replace what:="&", replacement:=" ", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    .Replace what:="/", replacement:=" ", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End With
Application.ScreenUpdating = True
End Sub

访问Excel很慢。在一个变量中存储您将访问两次以上的内容通常会更快,而将一系列单元格(一次调用Excel)转储到一个变量数组中则更好

记住,Excel和VBA是不同的。就像两个男人在同一套公寓里,但房间不同。每次访问Excel时,VBA都必须敲Excel的门

更新: 以上是所有代码的一般建议。考虑到上面的特定代码和您正在做的事情,在以下范围内使用Excel的搜索和替换功能可能会更快:

Sub test()

Application.ScreenUpdating = False
With Range("B1:B4000")
    .Replace what:="(", replacement:=" ", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    .Replace what:="&", replacement:=" ", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    .Replace what:="/", replacement:=" ", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End With
Application.ScreenUpdating = True
End Sub

除了Issun所说的之外,“点”的数量也会影响速度。我还要进一步说,如果你不止一次访问某个对象,你应该创建一个变量来代替它。+1表示立即获取范围的建议!快多了。+1很好的解释。但是在上面发布的情况下,我会使用With/End With块。在你的例子中,niko肯定会使用With或变量,但另一方面,变量经常会被过度使用,而且是不必要的。他问的问题不太适用于示例中的代码。我已经添加了一个示例,说明如何使用Excel功能完成这段特定代码,在这种情况下,这会非常快,我认为值得指出的是,当使用未知大小的可变阵列时,应测试范围,以确定是否容纳至少两个单元-因为可变阵列方法将在单个单元上产生错误。除了Issun所说的,点的数量还影响速度。我还要进一步说,如果你不止一次访问某个对象,你应该创建一个变量来代替它。+1表示立即获取范围的建议!快多了。+1很好的解释。但是在上面发布的情况下,我会使用With/End With块。在你的例子中,niko肯定会使用With或变量,但另一方面,变量经常会被过度使用,而且是不必要的。他问的问题不太适用于示例中的代码。我已经添加了一个示例,说明如何使用Excel功能完成这段特定代码,在这种情况下,这会非常快,我认为值得指出的是,当使用未知大小的变量数组时,应测试范围,以确定是否包含至少两个单元格-因为变量数组方法将在单个单元格上产生错误如果您不确定句子是否包含这3项,尽管它包含更多行代码,在执行替换之前,使用instr检查字符是否存在会更快。即使在不替换任何内容的情况下,替换也是一项成本非常高的操作。如果要进行大量字符串操作,则值得研究正则表达式。如果您不确定句子是否包含这3项,尽管代码行数更多,在执行替换之前,使用instr检查字符是否存在会更快。即使在不替换任何内容的情况下,替换也是一项成本非常高的操作。如果您正在执行大量字符串操作,那么值得研究正则表达式。