问:如何从Excel工作表中获取特定行中最后使用的列。
虽然这是a simple task using Excel VBA,但使用Powerpoint VBA会更加困难。
以下是我的Excel表单的示例
重现的步骤
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
答案 0 :(得分:3)
您发布的Excel特定代码实际上应该起作用,并为您提供与在Excel中执行它相同的结果。
您收到错误消息的原因很可能是您没有在Powerpoint VBA中包含Excel引用!您使用Late Binding,因此通常不需要引用此库。但是,VBA编译器不知道Excel常量/枚举xlToLeft
,xlLastCell
和xlPrevious
的内部值,因此会产生错误!
解决问题的两个选项:
? 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:使用范围内的最后一个单元格) 将不需要为您提供所需的答案 单元格已被使用,但其内容现在已删除,它将被视为该范围内的已用单元格。