Powerpoint VBA:如何从Excel工作表中连续获取最后一列

时间:2013-01-27 20:30:05

标签: vba powerpoint excel-2003

问:如何从Excel工作表中获取特定行中最后使用的列。
虽然这是a simple task using Excel VBA,但使用Powerpoint VBA会更加困难。

以下是我的Excel表单的示例

enter image description here

重现的步骤

  • 创造&保存一个新的Excel表格,如上面的例子
  • 打开一个新的PowerPoint演示文稿&为VBA编辑器点击 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标签? O.o

4 个答案:

答案 0 :(得分:3)

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

您收到错误消息的原因很可能是您没有在Powerpoint VBA中包含Excel引用!您使用Late Binding,因此通常不需要引用此库。但是,VBA编译器不知道Excel常量/枚举xlToLeftxlLastCellxlPrevious的内部值,因此会产生错误!

解决问题的两个选项:

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

答案 1 :(得分:0)

这是你能做的。 * proviso:未经测试的代码。如果这不起作用,请在评论*

中告诉我
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)。

答案 2 :(得分:0)

如果有人遇到类似问题,我只想发布更正后的代码。 (感谢Peter Albert

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

答案 3 :(得分:0)

@nixada,您可以通过 POWERPOINT vba进行:

您需要转到工作簿对象:(假设您在图表#1的幻灯片#1中具有excel数据:

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:使用范围内的最后一个单元格) 将不需要为您提供所需的答案 单元格已被使用,但其内容现在已删除,它将被视为该范围内的已用单元格。