在Excel中有大范围的循环问题

在Excel中有大范围的循环问题,excel,vba,Excel,Vba,此代码在给定范围内循环,并将每个值转换为短月份名称。它在小范围内工作得很好,但我是为一个定期获得的数据集编写的,该数据集远远超过100000行。它仍然可以在全范围内工作,但需要很长时间,看起来它崩溃了,但如果我等5分钟左右,它就可以工作了 关于如何改进这一点,有什么想法吗 Sub ConvertToMonth() Dim selectedRange As Range Set selectedRange = Application.Selection Application.ScreenUp

此代码在给定范围内循环,并将每个值转换为短月份名称。它在小范围内工作得很好,但我是为一个定期获得的数据集编写的,该数据集远远超过100000行。它仍然可以在全范围内工作,但需要很长时间,看起来它崩溃了,但如果我等5分钟左右,它就可以工作了

关于如何改进这一点,有什么想法吗

Sub ConvertToMonth()

Dim selectedRange As Range

Set selectedRange = Application.Selection

Application.ScreenUpdating = False

For Each Cell In selectedRange
       Cell.Value = MonthName(Cell.Value, True)
Next

Application.ScreenUpdating = True

End Sub

您的问题是Excel中前端范围的读/写速度。处理大型数据集的最佳方法是使用数组。首先,将数据集存储到数组中,操作该数组,然后输出该数组。就像我在下面所做的:

Sub-ConvertToMonth()
Dim selectedRange作为范围
Dim arr()作为变量,i作为
设置selectedRange=Application.Selection
arr=所选范围值
Application.ScreenUpdating=False
对于i=LBound(arr,1)到UBound(arr,1)
arr(i,1)=MonthName(arr(i,1),True)
接下来我
selectedRange.Value=arr
Application.ScreenUpdating=True
端接头

除非您确实需要在VBA中执行此操作,否则我认为最好使用Excel内置函数。 在下面的屏幕截图中,我对C3到C31使用了以下公式来获得给定日期月份的短名称:

=TEXT(A3,"MMM")

如果设计VBA仍然是一项挑战,那么它非常快速,并且可以避免VBA的复杂性

让我知道这是否满足您的需要

NB:我认为VBA函数的危险之处在于它是破坏性的,我的意思是在你启动它之后,你无法撤销它,而且它会覆盖所选内容,而不管它的内容如何。但是,在Excel中,您仍然可以撤消它。但这取决于你


你根本不需要在这里循环。只需一次将格式应用于整个范围



欢迎@WannabeDev,你为什么需要VBA来做这个手术?该死的Dean,工作起来很有魅力。你这个摇滚人。非常感谢。看来我得对数组做些挖掘了。@WannabeDev我教所有的大三学生VBA的三大支柱是数组、字典和集合!学习愉快@Dean,我可以认识到,在我测试了阵列与集合(选择范围内的单元格)的比较后,我得到了1000行的23秒速度差。数组非常快(y)谢谢,但这就是我正在做的,在大约第100次创建新列、编写公式并将结果复制/粘贴到原始列后,我希望有更好的方法。迪安给了我一个完美的解决方案。祝你一切顺利;)@WannabeDev您不必复制/粘贴公式,只需使用表(列表对象)。您所描述的内容非常简单,只需在表格第一个相邻列的第一个单元格中键入公式,然后按“Enter”。该表将添加列并通过整个新表列填充公式。@WannabeDev,我认为VBA函数的危险之处在于它具有破坏性,我的意思是,在启动它之后,您无法撤消它。但是,在Excel中,您仍然可以撤消它。但这取决于你是否欣赏所有优秀的评论,但是这个数据集远远超过100000行和~30列。然后,这些原始数据提供大约15个选项卡,每个选项卡上有3个透视表。向原始数据中添加另一列并更改数据透视中的所有引用(这是我从其他人处预先制作的)将是太多的工作。我更喜欢这样做,因为它不会覆盖选择的值!这可能有效,而且编写起来更简单,但我已经从@Dean实现了解决方案。谢谢你想到我。
SelectedRange.NumberFormat = "mmm"