3

Q: Excelシートから特定の行で最後に使用された列を取得するにはどうすればよいですか。
これはExcelVBAを使用する単純なタスクですが、 PowerpointVBAを使用するのはより困難です。

これが私のExcelシートの例です

ここに画像の説明を入力してください

再現する手順

  • 上記の例のように、新しいExcelシートを作成して保存します
  • 新しいPowerPointプレゼンテーションを開き、VBAエディターでALT+を押しますF11
  • 以下のコードを挿入し、3行目のテストExcelファイルへのパスをカスタマイズします
  • を使用して1行あたりのコード行を実行します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タグはありませんか?Oo

4

4 に答える 4

4

投稿したExcel固有のコードは実際に機能し、Excelで実行した場合と同じ結果が得られるはずです。

エラーメッセージが表示される理由は、PowerpointVBAにExcel参照を含めなかった可能性があります。実行時バインディングを使用するため、通常、このライブラリを参照する必要はありません。xlToLeftただし、VBAコンパイラはExcelの定数/列挙型の内部値を認識xlLastCellしていないxlPreviousため、エラーが発生します。

問題を解決するための2つのオプション:

  1. 参照にMicrosoftExcelライブラリを含める
  2. Excel固有の定数/列挙型を使用する代わりに、基礎となる数値を使用するだけです。これを行うには、ExcelVisualBasicエディターに移動します。イミディエイトウィンドウ(Ctrl- G)に? xlToLeft-と入力すると、結果が表示されます(この例では-4159)。次に、Powerpoint VBAの名前を番号に置き換えると、機能するはずです。(コードを読みやすくするために、通常、定数の名前を同じ行のコメントに残します。例:
    lastcol = objWorkbook.Sheets(1).Cells.SpecialCells(11).Column'xlLastCell = 11
    
于 2013-01-27T21:33:16.630 に答える
1

@ nixada、あなたはパワーポイント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列挙(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

誰かが同様の問題に遭遇した場合、私は修正されたコードを投稿したいと思います。( 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
于 2013-01-27T22:37:23.317 に答える