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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2241閲覧

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

misono

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/09/06 12:03

編集2018/09/06 16:35

前提・実現したいこと

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

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

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

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

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

該当のソースコード

Excel

1Sub CommandButton1_Click() 2 3'変数の宣言 4Dim フォルダ名 As String 5Dim 検索シート名 As String 6Dim 検索列名 As String 7Dim ファイル名 As String 8 9Dim ファイル数 As Long 10Dim 読み込みファイル行 As Long 11Dim wb選択ブック As Workbook 12Dim ws選択シート As Worksheet 13Dim 最終列数 As Long 14Dim 列名検索結果 As Range 15 16Dim i As Long 17Dim j As Long 18Dim x As Long 19 20'入力情報の読み込み 21ファイル格納場所名 = wsデータ一覧.Range("B2").Value 22検索シート名 = wsデータ一覧 .Range("B4").Value 23検索列名 = wsデータ一覧 .Range("B6").Value 24 25'その他変数の宣言 26ファイル数 = wsデータ一覧.Cells(Rows.Count, 2).End(xlUp).row - 9 27読み込みファイル行 = 10 28x = 2 29 30'ファイルの数だけ繰り返す 31For i = 1 To ファイル数 32 'ファイル名の取得 33 ファイル名 = wsデータ一覧.Cells(読み込みファイル行, 2).Value 34 'ファイルを開く & 検索するシートを指定 35 Set wb選択ブック = Workbooks.Open(フォルダ名 & ファイル名) 36 Set ws選択シート = wb選択ブック.Worksheets(検索シート名) 37 '検索するシートに対する処理 38 With ws選択シート 39 40 '最終列数を取得 41 最終列数 = .Cells(9, Columns.Count).End(xlToLeft).Column 42 43 '検索列に該当するものを検索 44 For j = 1 To 最終列数 45 Set 列名検索結果 = .Cells(9, j).Find(What:= 検索列名 , LookAt:=xlWhole) 46 If 列名検索結果 Is Nothing Then 47 48 '該当の検索列が存在した場合 49 Else 50 'ファイル名を検索結果シートにセット 51 ws検索結果.Cells(x, 1).Value = ファイル名 52 '次にセットするセルを指定 53 x = x + 1 54 '繰り返し処理を抜ける 55 Exit For 56 57 End If 58 Next j 59 End With 60 61 'ファイルを閉じる 62 wb選択ブック.Close 63 '次に読み込むファイルの行を指定 64 読み込みファイル行 = 読み込みファイル行 + 1 65Next i 66 67End Sub 68

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2018/09/06 13:02

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

2018/09/07 00:35

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

回答1

0

ベストアンサー

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

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

投稿2018/09/07 00:13

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misono

2018/09/07 00:46

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

2018/09/07 00:50 編集

ドット忘れは気付きにくいので、 [.]から入力してインテリセンスを利用する、 というクセをつける事をオススメします。 また、.End(xlToLeft).Column や、.End(xlUp).Row 等、 よく使う処理は関数にしておくと、 同じミスをしなくてすみますよ~
misono

2018/09/07 01:01

追加のアドバイスまでありがとうございます。 処理を関数にするという方法もあるんですね。 また自分で調べてみます。 この度は分かりやすい回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問