我希望执行以下操作:
- 按下按钮时,应激活宏。
- 宏选择工作表 2 中的 H 列(相同的工作簿)。不是整个列,直到数据消失。如果在该行之后接下来的 10 行为空,则可以确定最后一行的数据。
- 对于此选择,“常规”格式应用于每个单元格。
- 在此之后,G 列也是如此。
- 宏结束。
我认为这应该很容易实现,但我特别在“用数据确定最后一行”部分苦苦挣扎,好像应用于整个列时,PC 会大大减慢速度。
然后,我不确定我应该将代码(Sheet、ThisWorkbook、Module)放在哪里作为最佳实践。
我希望执行以下操作:
我认为这应该很容易实现,但我特别在“用数据确定最后一行”部分苦苦挣扎,好像应用于整个列时,PC 会大大减慢速度。
然后,我不确定我应该将代码(Sheet、ThisWorkbook、Module)放在哪里作为最佳实践。
还有其他方法可以做到这一点,但最简单的通常是选择一个大行号(是否会超过 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"
但它需要一些错误处理,以防这些范围不相交。
回答评论中的2个进一步问题:
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 编辑器中打开选项对话框来为所有模块启用此功能:工具 --> 选项,然后选中Require Variable Declaration旁边的框。