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

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

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

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Q&A

解決済

1回答

1772閲覧

アプリケーション定義またはオブジェクト定義のエラー 範囲指定の間違い? ブック名の処理 重複を防ぐ

SnowMonkey

総合スコア53

VBA

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

1グッド

0クリップ

投稿2019/01/27 15:26

編集2019/01/28 09:28

前提

フォルダ内に、複数のエクセルブック(被験者の人数分)があります。
それらのブックを1つのブックにまとめるコードを書きました。

例えば、
フォルダ内全ブックのSheet1を、複写先のSheet1に
フォルダ内全ブックのSheet2を、複写先のSheet2に まとめるものです

色々調べて
まとめること自体は一応できました。

ブック名に関する処理を追加しようとしたときに、皆様の
お知恵を拝借できればありがたいと思いました。

######ブック名
フォルダ内のブック名には、

  • 実験条件(たとえば測定したのが室内か野外か)と、
  • 2桁の被験者ID番号

の情報が含まれています

野外で測定した被験者12番のブックなら、
yagai12.xls とつけます。

実現したいこと・助言を欲しいこと

1.ブック名を切り分けて、A列とB列に記入する

yagai12.xls というブック名なら
yagaiと12を切り分けて、yagaiをA列に、12をB列の該当行に空白なく記入する

2.同じファイルを何度も処理しないようにする
これもブック名を使ってチェックすればいいのかなと思いますが、具体策が思いつかない。

3.ブック名に関する処理以外も含めて、もっと良い書き方があれば助言を得たい。

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

1.や2.の処理をする前段階として、ブック名を取得して、A列を埋めようとしたときに
上手くいきませんでした。

コードを実行すると以下のエラーメッセージが表示されます。

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

該当のソースコード

VBA

1Option Explicit 2 3'「data」フォルダにあるファイルを開いて、その内容をこのワークブックにまとめる 4Sub importData() 5Dim fso As FileSystemObject 6Set fso = New FileSystemObject 7 8 9Dim f As File 10For Each f In fso.GetFolder(ThisWorkbook.Path & "\data").Files 'dataフォルダにあるファイルを1つずつ開いて処理 11 With Workbooks.Open(f.Path) 12 Dim bkName As String 13 bkName = .Name 14 15 Dim i As Long 16 For i = 1 To Worksheets.Count ' 全シートを処理する 17 With .Worksheets("Sheet" & i) 18 19 '----------データの複写先のシートの最終行を取得-------------------- 20 Dim wsResult As Worksheet 21 Set wsResult = ThisWorkbook.Worksheets("Sheet" & i) 'データの複写先のシート 22 23 Dim LastRow As Long 24 LastRow = wsResult.Cells(Rows.Count, 3).End(xlUp).row 'データの複写先のシートの最終行 25 26 '------開いたシートの使用されている範囲を、複写先シートの最終行の次行にコピーする A列とB列は空欄にしておく------------ 27 .UsedRange.Copy wsResult.Cells(LastRow + 1, 3) 28 29 '------データを追加した範囲のA列にブック名を書き込む------------ 30' wsResult.Cells(LastRow + 1, 1).Value = bkName 'エラーは出ないが、空白セルができる 31 Dim LastRow2 As Long 32 LastRow2 = wsResult.Cells(Rows.Count, 2).End(xlUp).row 'データの複写先のシートの最終行を再び取得して 33 wsResult.Range(Cells(LastRow + 1, 1), Cells(LastRow2, 1)).Value = bkName 34 35 End With 36 Next i 37 .Close 38 39 End With 40 41Next f 42 43End Sub 44 45

上記のうち、この部分だと思います。ここを外すとエラーメッセージは出ません。

VBA

1 2 '------データを追加した範囲のA列にブック名を書き込む------------ 3' wsResult.Cells(LastRow + 1, 1).Value = bkName 'エラーは出ないが、空白セルができる 4 Dim LastRow2 As Long 5 LastRow2 = wsResult.Cells(Rows.Count, 2).End(xlUp).row 'データの複写先のシートの最終行を再び取得して 6 wsResult.Range(Cells(LastRow + 1, 1), Cells(LastRow2, 1)).Value = bkName 7

試したこと

1つのセルに記入できることを確認
→Rangeの使い方に問題がありそうということで、
ネットに記載されていたものをコピペしてみたが、
それでも上手くいかない。

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

Excel 2016

bochan2👍を押しています

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

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

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

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

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

hatena19

2019/01/28 04:15

エラーがでるコードがどれか明確にしてください。
guest

回答1

0

ベストアンサー

おそらく下記の行でエラーになっていると思いますが、

vba

1wsResult.Range(Cells(LastRow + 1, 1), Cells(LastRow2, 1)).Value = bkName

よくある間違いですね。 Cells とするとアクティブなシートを対象にしてしまいます。下記のようにちゃんとシートを省略せずに記述しないとダメですね。。

vba

1wsResult.Range(wsResult.Cells(LastRow + 1, 1), wsResult.Cells(LastRow2, 1)).Value = bkName

下記のような記述するするとスッキリするかも(好みですが)。

vba

1wsResult.Range("A" & LastRow & ":A" & (LastRow2)).Value = bkName

1.ブック名を切り分けて、A列とB列に記入する

切り分けの条件を明確にしてください。
被験者番号は2桁固定、実験条件の桁数は可変なのですか。
また拡張子は"xls"で固定ですか。
そうだとするなら、下記のようなコードてよろしいかと。

wsResult.Range("A" & LastRow & ":A" & (LastRow2)).Value = Left(bkName, Len$(bkName)-6)
wsResult.Range("B" & LastRow & ":B" & (LastRow2)).Value = Mid(bkName, Len$(bkName)-5,2)

2.同じファイルを何度も処理しないようにする
これもブック名を使ってチェックすればいいのかなと思いますが、具体策が思いつかない。

Findメソッドを使ってファイル名が見つかったら読み込み処理をしないようにすればいいでしょう。

条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド) :Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

ただ、自分なら、読み込み済みのファイルは、別フォルダーに移動させるようにしますね。
その方が読み込み済みかどうかが一目瞭然ですので。

ファイルを移動する(Nameステートメント):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

投稿2019/01/28 04:34

編集2019/01/28 05:07
hatena19

総合スコア33620

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

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

SnowMonkey

2019/01/28 09:37

ありがとうございます。なぜエラーメッセージがでるのかよく分かりました。 ブック名の切り分けや、処理の重複の問題への助言もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問