質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

VBAで最終列数が取得出来ない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,066

misono

score 7

 前提・実現したいこと

VBAの勉強を始めて2ヶ月の初心者です。

ユーザーにフォルダ名、検索シート名、検索列名を指定させ、予め用意したファイル一覧の中で、見出し(このプログラムだと9列目)に検索列名が含まれるものを別のシートに転記するプログラムをVBAで組んでいます。
以下のコードで実行時エラー1004『アプリケーション定義またはオブジェクト定義のエラーです』が出ます。

'最終列数を取得  
最終列数 = .Cells(9, Columns.Count).End(xlToLeft).Column 

 発生している問題・エラーメッセージ

実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです

 該当のソースコード

Sub CommandButton1_Click()

'変数の宣言
Dim フォルダ名 As String
Dim 検索シート名 As String
Dim 検索列名 As String
Dim ファイル名 As String

Dim ファイル数 As Long
Dim  読み込みファイル行   As Long
Dim  wb選択ブック   As Workbook
Dim  ws選択シート As Worksheet
Dim 最終列数 As Long
Dim 列名検索結果 As Range

Dim i As Long
Dim j As Long
Dim x As Long

'入力情報の読み込み
ファイル格納場所名 = wsデータ一覧.Range("B2").Value
検索シート名 =  wsデータ一覧  .Range("B4").Value
検索列名 =  wsデータ一覧  .Range("B6").Value

'その他変数の宣言
ファイル数 = wsデータ一覧.Cells(Rows.Count, 2).End(xlUp).row - 9
読み込みファイル行 = 10
x = 2

'ファイルの数だけ繰り返す
For i = 1 To ファイル数
  'ファイル名の取得
  ファイル名 = wsデータ一覧.Cells(読み込みファイル行, 2).Value
  'ファイルを開く & 検索するシートを指定
  Set wb選択ブック = Workbooks.Open(フォルダ名 & ファイル名)
  Set ws選択シート = wb選択ブック.Worksheets(検索シート名)
  '検索するシートに対する処理
  With ws選択シート

    '最終列数を取得
    最終列数 = .Cells(9, Columns.Count).End(xlToLeft).Column

    '検索列に該当するものを検索
    For j = 1 To 最終列数
      Set 列名検索結果 = .Cells(9, j).Find(What:= 検索列名 , LookAt:=xlWhole)
      If  列名検索結果  Is Nothing Then

      '該当の検索列が存在した場合
      Else
            'ファイル名を検索結果シートにセット
            ws検索結果.Cells(x, 1).Value = ファイル名
            '次にセットするセルを指定
            x = x + 1
            '繰り返し処理を抜ける
            Exit For

       End If
    Next j
  End With

  'ファイルを閉じる
  wb選択ブック.Close
  '次に読み込むファイルの行を指定
  読み込みファイル行 = 読み込みファイル行 + 1
Next i

End Sub

 試したこと

ws選択シートを指定するとエラーが出ます(ワークシートを指定しない場合はwsデータ一覧の最終列数が取得出来ました)。
そこで.Nameと.CodeNameで確認したところ、ws選択シートには正しいワークシートオブジェクトが入っていることが分かりました。

 補足情報(FW/ツールのバージョンなど)

使用しているのはExcel 2013です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • imihito

    2018/09/06 22:02

    修正依頼:ソースコードの`End Sub`の行の下にも「```」を追加してください。上下を「```」で囲むことでコードブロックとなり見やすくなります。 質問:wb選択ブックは「.xls」ファイル、コードが書かれているブックは「.xlsm」ファイルですか?

    キャンセル

  • misono

    2018/09/07 09:35

    修正依頼:教えてくださりありがとうございます。修正いたしました。 質問:仰る通り、wb選択ブックは「.xls」ファイル、コードが書かれているブックは「.xlsm」ファイルです。

    キャンセル

回答 1

checkベストアンサー

+2

Range、Cells、Columns、Rows、、、等は、[.]が無いとActiveSheetが適用されてしまいます。

なので、「.Cells(9, Columns.Count).End(xlToLeft).Column 」の
「Columns.Count」を「.Columns.Count」としないと、
エラーとなってしまうケースがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/07 09:46

    ありがとうございます。
    早速試してみたところ、問題なく動きました。
    Cellsでシートを指定していてもダメなんですね…勉強になります。

    キャンセル

  • 2018/09/07 09:49 編集

    ドット忘れは気付きにくいので、
    [.]から入力してインテリセンスを利用する、
    というクセをつける事をオススメします。

    また、.End(xlToLeft).Column や、.End(xlUp).Row 等、
    よく使う処理は関数にしておくと、
    同じミスをしなくてすみますよ~

    キャンセル

  • 2018/09/07 10:01

    追加のアドバイスまでありがとうございます。
    処理を関数にするという方法もあるんですね。
    また自分で調べてみます。

    この度は分かりやすい回答ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる