3

问:如何从 Excel 工作表中获取特定行中最后使用的列。
虽然这是使用 Excel VBA 的简单任务,但使用 Powerpoint VBA 更困难。

这是我的 Excel 工作表的示例

在此处输入图像描述

重现步骤

  • 创建并保存一个新的 Excel 工作表,如我上面的示例
  • 为 VBA 编辑器打开一个新的 PowerPoint 演示文稿并点击ALT+F11
  • 插入下面的代码并在第 3 行自定义测试 Excel 文件的路径
  • 使用每行执行代码行F8
Sub findlastcolumn()

    Set objExcel = CreateObject("Excel.application")
    Set objWorkbook = objExcel.Workbooks.Open("C:\Users\<USERNAME>\Desktop\data.xls")

    objExcel.Visible = True

    'works in Powerpoint VBA but delivers the wrong column
    lastcol = objWorkbook.Sheets(1).UsedRange.Columns.Count

    'produces an error in Powerpoint VBA
    'but works in Excel VBA, correct column in Excel VBA
    lastcol = objWorkbook.Sheets(1).Cells(1, 254).End(Direction:=xlToLeft).Column

    'produces an error in Powerpoint VBA
    'but works in Excel VBA, and wrong column in Excel VBA too
    lastcol = objWorkbook.Sheets(1).Cells.SpecialCells(xlLastCell).Column

    'wrong column. Powerpoint VBA' find method differs from Excel' find method
    'searchdirection isn't available in Powerpoint VBA
    lastcol = objWorkbook.Sheets(1).Rows(1).Find(what:="*", _ 
        after:=objWorkbook.Sheets(1).Cells(1, 1), searchdirection:=xlPrevious).Column

    objExcel.Quit
    Set objWorkbook = Nothing
    Set objExcel = Nothing

End Sub

期望的结果:我想得到 lastcol = 3

我的代码中的注释向您展示了我到目前为止所做的尝试以及它们产生的错误。
我很感谢任何建议。

有没有 PowerPoint 2003 标签?哦

4

4 回答 4

4

您发布的 Excel 特定代码实际上应该可以工作,并为您提供与在 Excel 中执行它相同的结果。

您收到错误消息的原因很可能是您没有在 Powerpoint VBA 中包含 Excel 参考!您确实使用了后期绑定,因此通常不需要引用此库。但是,VBA 编译器不知道 Excel 常量/枚举的内部值,xlToLeft因此xlLastCellxlPrevious产生错误!

解决您的问题的两种选择:

  1. 在您的参考文献中包含 Microsoft Excel 库
  2. 而不是使用 Excel 特定的常量/枚举,只需使用它们的基础数值。为此,请转到 Excel Visual Basic 编辑器。在立即窗口 ( Ctrl- G) 中,键入? xlToLeft- 您将得到结果(在本例中-4159)。然后用数字替换 Powerpoint VBA 中的名称,它应该可以工作。(为了更好的代码可读性,我通常将常量的名称留在同一行的注释中,例如
    lastcol = objWorkbook.Sheets(1).Cells.SpecialCells(11).Column 'xlLastCell = 11
    
于 2013-01-27T21:33:16.630 回答
1

@nixada,您可以POWERPOINT vba 执行此操作:

您需要访问工作簿对象:(假设您在幻灯片 #1 中有 Excel 数据,在图表 #1 上:

Set cht = ActivePresentation.Slides(1).Shapes(1).Chart
Set DataWorkBook = cht.ChartData.Workbook

然后你应该使用空白类型得到你的最后一个空白列:

LastCol = DataWorkBook.Sheets(1).Cells.SpecialCells(4).Column -1 'xlCellTypeBlanks = 4

那应该给你想要的答案“ 3

注意:类型列表可以参考XlCellType enumeration (Excel)

编辑:使用 xlCellTypeLastCell (= 11:使用范围内的最后一个单元格)不会给您所需的答案,就好像使用了一个单元格但现在删除了它的内容,它将被视为该范围内的已用单元格。

于 2019-11-19T21:32:24.160 回答
0

这是你可以做的。* 附带条件:未经测试的代码。如果这不起作用,请在评论中告诉我 *

Dim r as Range
Dim col = 0
set r = objWorkbook.Sheets(1).Range("A1")
while(** test that r has something in it **)
  col = col + 1
  set r = r.offset(0, 1)
end

我没有方便的设置来确定测试应该是什么——但这应该很容易。关键是这不使用 Powerpoint VBA 不知道的常量(如 xlDown)。

于 2013-01-27T20:43:26.783 回答
0

如果有人遇到类似问题,我只想发布更正的代码。(感谢彼得·阿尔伯特

Sub findlastcolumn()

    Set objExcel = CreateObject("Excel.application")
    Set objWorkbook = objExcel.Workbooks.Open("C:\Users\<USERNAME>\Desktop\input data.xls")        
    objExcel.Visible = True
    icolumn = 1 'which column should be checked (in sheet 1) 

    'works
    Set r = objWorkbook.Sheets(1).Cells(icolumn, objWorkbook.Sheets(1).Columns.Count)
    Do: Set r = r.offset(0, -1)
    Loop While r.Value = ""
    lastcol1 = r.Column

    'works
    lastcol2 = objWorkbook.Sheets(1).Cells(icolumn, _ 
       objWorkbook.Sheets(1).Columns.Count).End(Direction:=-4159).Column

    'works
    lastcol3 = objWorkbook.Sheets(1).Rows(icolumn).Find(what:="*", _
        after:=objWorkbook.Sheets(1).Cells(1, 1), searchdirection:=2).Column

    'works - but not if your columns have different last cells
    lastcol4 = objWorkbook.Sheets(1).UsedRange.Columns.Count

    'works - but not if your columns have different last cells
    lastcol5 = objWorkbook.Sheets(1).Cells.SpecialCells(11).Column

End Sub
于 2013-01-27T22:37:23.317 回答