【问题标题】:Powerpoint VBA: How to get last used column in a row from an Excel sheetPowerpoint VBA:如何从 Excel 工作表中获取一行中最后使用的列
【发布时间】:2019-11-20 05:32:24
【问题描述】:

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

这是我的 Excel 工作表的示例

复制步骤

  • 创建并保存一个新的 Excel 工作表,如我上面的示例
  • 打开一个新的 PowerPoint 演示文稿并按 ALT+F11 以使用 VBA 编辑器
  • 插入下面的代码并在第 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

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

没有 PowerPoint 2003 标签? O.o

【问题讨论】:

  • +1 表示“问得很漂亮的问题”。建议您编辑示例 - 将代码稍微包装一下以提高可读性...

标签: vba powerpoint excel-2003


【解决方案1】:

您发布的 Excel 特定代码应该确实有效,并为您提供与在 Excel 中执行它相同的结果。

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

解决问题的两个选项:

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

【讨论】:

  • +1 教我如何获取常量的基础数值
【解决方案2】:

@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:使用范围内的最后一个单元格)不一定会给你想要的答案,就好像一个单元格被使用但其内容现在被删除,它将被视为该范围内的已使用单元格。

【讨论】:

    【解决方案3】:

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

    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)。

    【讨论】:

    • 这行得通。但是:我上面的小例子只是为了展示。真实的 Excel 数据可能非常大。循环遍历每个单元格不是我想要的。性能损失将太大:( --- 顺便说一句。您的初始代码仅在没有空白单元格的情况下才有效。但是如果您向后退,它将起作用。
    • 很高兴它有帮助。除非您必须多次执行此操作,否则您会惊讶于您的代码在这些单元格中运行的速度有多快。我怀疑你能说代码甚至正在运行。如果有问题,您可以将=counta("A1:whatever your last cell minus one is") 放在电子表格的最后一个单元格中,看看数字是多少。那就是“里面有东西的细胞数量”。取该单元格的 .Value ,然后将其擦除。如果此代码有效,您可能会“接受”答案...
    【解决方案4】:

    如果有人遇到类似问题,我只想发布更正后的代码。 (感谢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
    

    【讨论】:

    • 太棒了!!但是......正如问题所要求的那样 - 你如何从 powerpoint vba 做到这一点???
    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2015-05-07
    相关资源
    最近更新 更多