select列并将“常规”格式应用于所有单元格+将macros放在button上

我期待着做到以下几点:

当按下一个button时,macros应该被激活。 macrosselect列H(不是整列,直到数据发送,在第2页(相同的工作簿)中,最后一行包含数据,可以确定后面10行是否为空)。 对于此select,“常规”格式应用于每个单元格。 在此之后,列G相同。然后,​​macros结束。

我觉得应该很容易,但是我特别在“确定数据的最后一行”这个部分挣扎,就好像应用在整个专栏一样,PC大大减慢。

然后,我不确定我应该把代码(Sheet,ThisWorkbook,Module)作为最佳实践。

还有其他的方法可以做到这一点,但最简单的方法一般是select一个大的行号(将会有超过20000行?)并向上导航。

Range("H2", Range("H20000").End(xlUp)).NumberFormat = "General" Range("G2", Range("G20000").End(xlUp)).NumberFormat = "General" 

但是你也可以格式化整个列:

 Range("G:H").NumberFormat = "General" 

这不(现在)影响文件的大小。

你想单击工作表的button来运行macros,所以你可以使用表单控件,button,然后代码将在一个标准的模块。

添加 (从我的评论):

这将工作:

 Application.Intersect(ActiveSheet.UsedRange, Range("G:H")).NumberFormat = "General" 

但它需要一些error handling,以防万一这些范围不相交。

在回复2个其他问题的意见:

 Worksheets("Whatever").Activate 

如果应用于列的NumberFormat不起作用,那么必须有其他事情干扰 – 或者导入(?)时数据可能是错误的 。 尝试:

 Application.CalculateFull 

或者只是使用特定的范围:

 Range("..").Calculate 

如果这不起作用,则可能需要将数据复制到空白列并删除旧列。 或者也许复制并粘贴(也许值)到相同的范围。

您可以格式化G和H列中的所有单元格,而不必select范围或表格。 你应该总是避免在你的VBA代码中select任何东西。

用数据find最后一行的事实上的标准方法是从表单底部开始并从那里上去。

以下是在G和H列的sheet2中find最后一个单元格的数据。我们使用两者中最大的一个来设置我们将用于应用通用格式的范围。

 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出现在模块的顶部,以便需要variables声明。 您可以通过打开VBA编辑器中的选项对话框打开所有模块: Tools – > Options ,然后选中Require Variable Declaration旁边的checkbox。