使用Excel,试图从外部HTA中find真正使用的范围

我一直在使用这个命令:

LastRow = ActiveSheet.UsedRange.Rows.Count 

但UsedRange属性通常可能不准确。 所以我正在寻找替代品。 我发现了一个很棒的提示,解释了这种方

 LastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

这在Excel中工作。 但是,我正在运行HTA代码,所以我需要转换这一行,而我正在挣扎。 这是我的问题—请有人提供关于如何将这个简单的代码转换为HTA兼容的指导?

出于兴趣,为了避免这个问题,我试着以我理解的方式写一个例程。 结果起作用 ,但是非常缓慢。 这是为了咯咯地笑起来:

  Set objExcel = GetObject(,"Excel.Application") wb = "test.xlsx" objExcel.Workbooks(wb).Activate wbactiveSheet = objExcel.Workbooks(wb).ActiveSheet.Name 'determine rows and columns in range of first xls theNumRow = objExcel.Workbooks(wb).Sheets(wbactiveSheet).UsedRange.Rows.Count theNumCol = objExcel.Workbooks(wb).Sheets(wbactiveSheet).UsedRange.Columns.Count 'determine genuine used rows: x = 1 'start at first row blankRows = 0 Do 'each row y = 1 'start at first column blankCells = 0 Do 'each column If objExcel.Workbooks(wb).Sheets(wbactiveSheet).Cells(x, y).Value <> "" Then theNumRowActual = x 'found non-blank, skip to next row Exit Do 'the columns loop Else blankCells = blankCells + 1 End If y = y + 1 Loop Until (y - 1) = theNumCol If blankCells = theNumCol Then 'blank row blankRows = blankRows + 1 If blankRows = 50 Then Exit Do End If Else blankRows = 0 End If x = x + 1 Loop Until x = theNumRow 'ie until the testing area matches the usedRange property 'determine genuine used columns: y = 1 'start at first column blankCols = 0 Do 'each column x = 1 'start at first row blankCells = 0 Do 'each row If objExcel.Workbooks(wb).Sheets(wbactiveSheet).Cells(x, y).Value <> "" Then theNumColActual = y 'found non-blank, skip to next column Exit Do 'the rows loop Else blankCells = blankCells + 1 End If x = x + 1 Loop Until (x - 1) = theNumRowActual If blankCells = theNumRowActual Then 'blank column blankCols = blankCols + 1 If blankCols = 50 Then Exit Do End If Else blankCols = 0 End If y = y + 1 Loop Until (y - 1) = theNumCol 'ie until the testing area matches the usedRange property 'bug MsgBox "USEDRANGEMETHOD:" &vbNewLine & "rows: " & theNumRow & vbNewLine & "columns: " & theNumCol & vbNewLine & vbNewLine & "NEWMETHOD:" & vbNewLine & "rows: " & theNumRowActual & vbNewLine & "columns: " & theNumColActual 

谢谢

它看起来像你已经有你的工作表打开和活跃? 在这种情况下:

 Const xlByRows = 1 Const xlPrevious = 2 Set objExcel = GetObject(,"Excel.Application") LastRow = objExcel.ActiveSheet.Cells.Find("*", , , , xlByRows, xlPrevious).Row 

看到我最近的post关于使用VBScript调用Excel函数的其他技巧。

在Excel中使用VBA进行编程时, Cells是一个本地对象,您可以直接参考。 但是当你在Excel 之外 – 在HTA或WSH脚本中 – 你的脚本不知道Cells是指什么。 你有唯一的Excel对象是你创build的。 因此,您必须沿着链条从主Excel( Application )对象到工作簿再到工作表,然后才能对Cells属性进行操作。 如果你使用相同的名称Excel,这可能会更有意义:

 ' Define the same objects that Excel does... Set Application = GetObject(, "Excel.Application") Set ThisWorkbook = Application.ActiveWorkbook ' Now get a sheet based on its name ("Sheet1", in this example).. Set MySheet = ThisWorkbook.Sheets("Sheet1") ' And operate on the Cells collection... MySheet.Cells.Find(...) 

作为一个快捷方式,Excel提供了一个ActiveSheet属性,您可以直接在Application对象上使用该属性来获取当前工作表,从本质上绕过工作簿层。 这就是我在我的第一个代码片段中使用的。