我正在尝试执行以下操作:
[我认为这应该很容易实现,但是我尤其在“确定数据的最后一行”部分上苦苦挣扎,好像将PC应用于整个列会大大减慢速度。
然后,我不确定应该将代码(Sheet,ThisWorkbook,模块)作为最佳实践放置在哪里。
还有其他方法可以做到这一点,但通常最简单的方法是选择一个大行号(是否会有超过20,000行?)并向上导航。
Range("H2", Range("H20000").End(xlUp)).NumberFormat = "General"
Range("G2", Range("G20000").End(xlUp)).NumberFormat = "General"
但是您也可以格式化整个列:
Range("G:H").NumberFormat = "General"
这(目前)不会影响文件的大小。
您想单击工作表的按钮来运行宏,因此可以使用窗体控件,按钮,然后代码将位于标准模块中。
已添加(根据我的评论):
这将起作用:
Application.Intersect(ActiveSheet.UsedRange, Range("G:H")).NumberFormat = "General"
但是它需要一些错误处理,以防万一这些范围不相交。
回复评论中的其他两个问题:
Worksheets("Whatever").Activate
如果应用于列的NumberFormat
无法正常工作,则必定会发生其他干扰-或在导入(?)时数据为故障。试试:
Application.CalculateFull
或仅使用特定范围:
Range("..").Calculate
如果这不起作用,那么您可能必须将数据复制到空白列并删除旧列。或者也许将(可能是值)复制并粘贴到相同的范围内。
您可以在不选择范围或工作表的情况下,对G和H列中的所有单元格进行常规格式化。您应该始终避免在VBA代码中选择任何内容。
找到数据的最后一行的事实上的标准方法是从工作表的底部开始,然后从那里开始。
以下内容在G和H列中找到了sheet2上数据最后的单元格。我们使用两者中的最大值来设置将应用一般格式的范围。
Sub GeneralFormatForAllPopulatedCells()
Dim wb As Workbook
Dim ws As Worksheet
Dim g As Long, h As Long
Dim lastRow As Long
Dim rng As Range
Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet2")
g = ws.Range("G" & ws.Rows.Count).End(xlUp).Row
h = ws.Range("H" & ws.Rows.Count).End(xlUp).Row
If g > h Then
lastRow = g
Else
lastRow = h
End If
Set rng = ws.Range("G1:H" & lastRow)
rng.NumberFormat = "General"
End Sub
您应将代码放置在模块中,并确保Option Explicit
出现在模块顶部,以便需要变量声明。您可以通过在VBA编辑器中打开选项对话框来打开所有模块的功能:工具->选项,然后选中需要变量声明旁边的框。