gpt4 book ai didi

excel - 使用 Excel,试图从外部 HTA 中找到真正的使用范围

转载 作者:行者123 更新时间:2023-12-04 20:16:33 24 4
gpt4 key购买 nike

我一直在使用这个命令:

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 'i.e. 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 'i.e. 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

见我的 recent post关于使用 VBScript 调用 Excel 函数的更多提示。

当您在 Excel 中使用 VBA 编程时, Cells是可以直接引用的 native 对象。但是当你在 Excel 之外——在 HTA 或 WSH 脚本中——你的脚本不知道什么 Cells指。您拥有的唯一 Excel 对象是您创建的对象。因此,您必须沿着链向下工作,从主 Excel ( Application) 对象到工作簿,然后再到工作表,然后才能对 Cells 进行操作。属性(property)。如果您使用与 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 上使用的属性对象来获取当前工作表,基本上绕过了工作簿层。这就是我在我的第一个代码片段中使用的。

关于excel - 使用 Excel,试图从外部 HTA 中找到真正的使用范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22897490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com