Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


648 / 13645 ツリー ←次へ | 前へ→

【79230】複数のファイルに存在する表を抜き出して一覧にする。 inoue 17/6/18(日) 2:08 質問[未読]
【79231】Re:複数のファイルに存在する表を抜き出し... マナ 17/6/18(日) 8:07 発言[未読]
【79233】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/18(日) 14:23 回答[未読]
【79236】Re:複数のファイルに存在する表を抜き出し... マナ 17/6/18(日) 15:19 発言[未読]
【79238】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/18(日) 17:16 回答[未読]
【79240】Re:複数のファイルに存在する表を抜き出し... マナ 17/6/18(日) 18:21 発言[未読]
【79244】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/18(日) 20:30 回答[未読]
【79247】Re:複数のファイルに存在する表を抜き出し... マナ 17/6/18(日) 21:17 発言[未読]
【79248】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/18(日) 22:46 お礼[未読]
【79249】Re:複数のファイルに存在する表を抜き出し... マナ 17/6/18(日) 23:22 発言[未読]
【79254】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/19(月) 21:14 発言[未読]
【79232】Re:複数のファイルに存在する表を抜き出し... γ 17/6/18(日) 14:11 発言[未読]
【79234】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/18(日) 14:30 回答[未読]
【79235】Re:複数のファイルに存在する表を抜き出し... カリーニン 17/6/18(日) 14:45 発言[未読]
【79237】Re:複数のファイルに存在する表を抜き出し... カリーニン 17/6/18(日) 15:25 発言[未読]
【79239】Re:複数のファイルに存在する表を抜き出し... inoue 17/6/18(日) 17:20 回答[未読]

【79230】複数のファイルに存在する表を抜き出して...
質問  inoue  - 17/6/18(日) 2:08 -

引用なし
パスワード
   こんばんは。
お世話になります。inoueと申します。

当方初心者でありまして、標記のようなことをしたく、
助力いただけないかと投稿させていただきました。

早速ではありますが、簡単に図で説明させていただきます。

現状−−−−−−−−−−−−−−−−−−

ファイル1
  電圧 電流 ・・・・・・ 
a  1  2
b  3  4
c  5  6

ファイル2
  電圧 電流 ・・・・・・
d  7  8
e  9  10
f  11 12

ファイル3
ファイル4
ファイル5




−−−−−−−−−−−−−−−−−

現在、上図のような表を含むファイルが500個ほどあります。
すべてのファイルのすべての表を一つのファイルの一つの表に
まとめたいと考えています。

ひとつひとつのファイルを開いてコピー&ペーストではあまりに
時間がかかりますので、vbaにてファイルを開かずに特定のセル値を
抜き出してくることはできないかと考えています。

やりたい−−−−−−−−−−−−−

ファイルx(ファイル1からすべてのファイルの情報を集約したファイル)
 電圧 電流 ・・・・・・
a 1  2
b 3  4
c 5  6
d 7  8
e 9  10
f 11 12




ーーーーーーーーーーーーーーーーーーー

vbaの応用例を調べて、同一フォルダ内に存在するすべてのファイルから指定した
セル(A1等)の値を一覧にするvbaは作成できたのですが、
厄介なことにデータの元であるファイル1とファイル2とでは表はまったく異なる
セル番号の場所に作られており、vbaの中であらかじめセル番号を指定するといった
方法では望みの抜き出し方をすることができませんでした。

恐らく、表の各見出し(電圧 等)をvba中で指定してその見出しを検索し、
その見出しの列を抜き出してくるといった方法でうまくいくのかと思うのですが、
具体的にどのようなvbaを組んだらいいのかわかりません。

当方初心者でありまして、各命令文が何を意味しているのか理解が乏しいです。
大変恐縮ですが、上記のような図の抜き出し方が叶うvbaの作成例がございましたら
貼り付けてくださると幸いです。

下記にデータ元である手持ちファイルについて補足させていただきます。
1.それぞれのファイル名には規則性はないため、複数のファイルを指定するためには
同一フォルダ内のファイル、という指定が良いと考えています。
2.各ファイルのシート名も多少ばらつきがあります(まとめ、まとめ1 など)
そのファイルを最後に開いたシートから読みだしてくるような指定の仕方をするのが
よいかと思っています。

不躾な質問ながら、ご回答いただけますと幸いです。
何卒よろしくお願い申し上げます。

【79231】Re:複数のファイルに存在する表を抜き出...
発言  マナ  - 17/6/18(日) 8:07 -

引用なし
パスワード
   ▼inoue さん:

>vbaの応用例を調べて、同一フォルダ内に存在するすべてのファイルから指定した
>セル(A1等)の値を一覧にするvbaは作成できたのですが、

どいうものを作成したか教えてください。
それを改良できるかもしれません。

【79232】Re:複数のファイルに存在する表を抜き出...
発言  γ  - 17/6/18(日) 14:11 -

引用なし
パスワード
   ファイルを開かずには無理です。
それにこだわるなら、達成できません。
普通の手法でトライして下さい。

【79233】Re:複数のファイルに存在する表を抜き出...
回答  inoue  - 17/6/18(日) 14:23 -

引用なし
パスワード
   ▼マナ さん:
>▼inoue さん:
>
>>vbaの応用例を調べて、同一フォルダ内に存在するすべてのファイルから指定した
>>セル(A1等)の値を一覧にするvbaは作成できたのですが、
>
>どいうものを作成したか教えてください。
>それを改良できるかもしれません。

ご返信ありがとうございます。
下記に記載します。

Sub getA_F()

Application.ScreenUpdating = False

Const myPath As String = "C:Users\ユーザ名\Desktop\フォルダ名\"
Dim rIdx As Long
Dim fName As Strimg
fName = Dir (myPath & "*.xls")
Do Until fName = ""
Workbooks.Open Filename:=myPath & fName
rIdx = rIdx + 1

Cells(rIdx, 1).Value = fName
Me.Cells(rIdx, 2).Value = ActiveSheet.Range("A1").Value
Me.Cells(rIdx, 3).Value = ActiveSheet.Range("B1").Value
Me.Cells(rIdx, 4).Value = ActiveSheet.Range("C1").Value
Me.Cells(rIdx, 5).Value = ActiveSheet.Range("D1").Value
Me.Cells(rIdx, 6).Value = ActiveSheet.Range("E1").Value
Me.Cells(rIdx, 7).Value = ActiveSheet.Range("F1").Value

Windows(fName).Close
fName = Dir
Loop

Applicaion.ScreenUpdating = True

End Sub

よろしくお願いいたします。

【79234】Re:複数のファイルに存在する表を抜き出...
回答  inoue  - 17/6/18(日) 14:30 -

引用なし
パスワード
   ▼γ さん:
>ファイルを開かずには無理です。
>それにこだわるなら、達成できません。
>普通の手法でトライして下さい。


ご返信ありがとうございます。

言葉の使い方が悪く申し訳ありませんが、
手動でファイルを開かずに、ということでした。
vbaには自動でファイルを開いて自動で閉じてくれる
命令文もあるようですがそれでも不可能でしょうか。

しつこいようですが、何卒よろしくお願いいたします。

【79235】Re:複数のファイルに存在する表を抜き出...
発言  カリーニン  - 17/6/18(日) 14:45 -

引用なし
パスワード
   横から失礼します。

>vbaには自動でファイルを開いて自動で閉じてくれる
>命令文もあるようですがそれでも不可能でしょうか。

これはマクロの自動記録で参考コードが得られますし、ネットの検索で
いくらでも参考コードが得られると思います。

【79236】Re:複数のファイルに存在する表を抜き出...
発言  マナ  - 17/6/18(日) 15:19 -

引用なし
パスワード
   ▼inoue さん:

今のコードを修正していけばできると思います。
課題は、

1)表の場所が、決まっていない
2)シート名が決まっていない(まとめ、まとめ1 など)

の2点ですね。
まずは、1)から。

・表の横サイズ(列数)は固定ですか
・表に必ずあって、他にはない単語はありますか。

例えば、電圧というセルは、シート内に1箇所ですか
もし、そうなら、電圧を検索して、見つかったセルから
転記するセル範囲を決めることができませんか。

【79237】Re:複数のファイルに存在する表を抜き出...
発言  カリーニン  - 17/6/18(日) 15:25 -

引用なし
パスワード
   よくみたら、ご自身が書いたコードの中にブックを開く記述がありましたね。

【79238】Re:複数のファイルに存在する表を抜き出...
回答  inoue  - 17/6/18(日) 17:16 -

引用なし
パスワード
   ▼マナ さん:
>▼inoue さん:
>
>今のコードを修正していけばできると思います。
>課題は、
>
>1)表の場所が、決まっていない
>2)シート名が決まっていない(まとめ、まとめ1 など)
>
>の2点ですね。
>まずは、1)から。
>
>・表の横サイズ(列数)は固定ですか
>・表に必ずあって、他にはない単語はありますか。
>
>例えば、電圧というセルは、シート内に1箇所ですか
>もし、そうなら、電圧を検索して、見つかったセルから
>転記するセル範囲を決めることができませんか。

ご返信ありがとうございます。

1)
・表の横サイズは固定です。

・表に必ずあってほかにない単語はあります。
→表の左上に必ず同じ表題が1か所ついています。

また、目印となりそうな心当たりとして挙げた「電圧」は
表以外にも存在しますが、目的の表の「電圧」はセルの左上から
数えて一番初め(VLoolupだと最初に検索に引っかかる場所)にあります。

>もし、そうなら、電圧を検索して、見つかったセルから
>転記するセル範囲を決めることができませんか。
という部分についてですが、そのような発想でvbaを書きたいのですが
知識が乏しくvlookupのようなことをする機能を自分でvbaに書くことが
できません。

以上、何卒よろしくお願いいたします。

【79239】Re:複数のファイルに存在する表を抜き出...
回答  inoue  - 17/6/18(日) 17:20 -

引用なし
パスワード
   ▼カリーニン さん:
>よくみたら、ご自身が書いたコードの中にブックを開く記述がありましたね。

ご返信いただきありがとうございます。

記載させていただいたコードはほぼネット検索で出てきた
そのままを使用しています。

そのため、ここの部分がこんなことを表しているんだろうな
程度はわかるのですが、このコードに新しいコードを入れたりする
ことが知識に乏しくできません。。

【79240】Re:複数のファイルに存在する表を抜き出...
発言  マナ  - 17/6/18(日) 18:21 -

引用なし
パスワード
   ▼inoue さん:

CurrentRegionが使えるならば
データ範囲をこんな感じでコピーできるかもしれません。

Sub test()
  Dim ws As Worksheet
  Dim r As Range
  Dim myStr As String
  
  myStr = "目印"
  
  Set ws = ActiveSheet
  Set r = ws.Cells.Find(What:=myStr, LookIn:=xlValues, LookAt:=xlWhole)
  
  Set r = r.CurrentRegion
  Set r = Intersect(r, r.Offset(2))

  r.Copy
  
  Worksheets.Add
  Range("A3").PasteSpecial xlPasteValues
  
End Sub

【79244】Re:複数のファイルに存在する表を抜き出...
回答  inoue  - 17/6/18(日) 20:30 -

引用なし
パスワード
   ▼マナ さん:
>▼inoue さん:
>
>CurrentRegionが使えるならば
>データ範囲をこんな感じでコピーできるかもしれません。
>
>Sub test()
>  Dim ws As Worksheet
>  Dim r As Range
>  Dim myStr As String
>  
>  myStr = "目印"
>  
>  Set ws = ActiveSheet
>  Set r = ws.Cells.Find(What:=myStr, LookIn:=xlValues, LookAt:=xlWhole)
>  
>  Set r = r.CurrentRegion
>  Set r = Intersect(r, r.Offset(2))
>
>  r.Copy
>  
>  Worksheets.Add
>  Range("A3").PasteSpecial xlPasteValues
>  
>End Sub

マナさん

コードを記載いただきありがとうございます。

早速試してみたところ、最後に開いていた?と思われるファイルの
取得したい領域が取得できました!

しかし、取得できた領域はその1ファイルのみでした。
これを任意のフォルダ内にあるすべてのファイルに対して行うためには
どのようにすればよいでしょうか。

また、何度か試しておりましたところ、
「オブジェクト変数またはwithブロック変数が設定されていません。」
というエラーが出てきました。

たびたび申し訳ありませんが、引き続きご助言いただけますと幸いです。

【79247】Re:複数のファイルに存在する表を抜き出...
発言  マナ  - 17/6/18(日) 21:17 -

引用なし
パスワード
   ▼inoue さん:

>しかし、取得できた領域はその1ファイルのみでした。
>これを任意のフォルダ内にあるすべてのファイルに対して行うためには
>どのようにすればよいでしょうか。

現在のコードで、値を転記している箇所、

>rIdx = rIdx + 1
>
>Cells(rIdx, 1).Value = fName
>Me.Cells(rIdx, 2).Value = ActiveSheet.Range("A1").Value
>Me.Cells(rIdx, 3).Value = ActiveSheet.Range("B1").Value
>Me.Cells(rIdx, 4).Value = ActiveSheet.Range("C1").Value
>Me.Cells(rIdx, 5).Value = ActiveSheet.Range("D1").Value
>Me.Cells(rIdx, 6).Value = ActiveSheet.Range("E1").Value
>Me.Cells(rIdx, 7).Value = ActiveSheet.Range("F1").Value

ここに、組み込むのです。
考えてみてください。
転記先のセルは、End(xlup).Offset(1)で求めると良いと思います。

【79248】Re:複数のファイルに存在する表を抜き出...
お礼  inoue  - 17/6/18(日) 22:46 -

引用なし
パスワード
   ▼マナ さん:
>▼inoue さん:
>
>>しかし、取得できた領域はその1ファイルのみでした。
>>これを任意のフォルダ内にあるすべてのファイルに対して行うためには
>>どのようにすればよいでしょうか。
>
>現在のコードで、値を転記している箇所、
>
>>rIdx = rIdx + 1
>>
>>Cells(rIdx, 1).Value = fName
>>Me.Cells(rIdx, 2).Value = ActiveSheet.Range("A1").Value
>>Me.Cells(rIdx, 3).Value = ActiveSheet.Range("B1").Value
>>Me.Cells(rIdx, 4).Value = ActiveSheet.Range("C1").Value
>>Me.Cells(rIdx, 5).Value = ActiveSheet.Range("D1").Value
>>Me.Cells(rIdx, 6).Value = ActiveSheet.Range("E1").Value
>>Me.Cells(rIdx, 7).Value = ActiveSheet.Range("F1").Value
>
>ここに、組み込むのです。
>考えてみてください。
>転記先のセルは、End(xlup).Offset(1)で求めると良いと思います。

マナさん

度重なるご指導ありがとうございます!!
おっしゃる通りにしましたら望みのことができました。
日曜日にこのような無知なものにお付き合いいただき
誠にありがとうございました。
これを機にvbaのコードにも理解を深めていきたく思います。

下記に成功したコードを記載させていただきます。

Sub test()

Application.ScreenUpdating = False

Const myPath As String = "C:Users\ユーザ名\Desktop\フォルダ名\"
Dim fName As Strimg
fName = Dir (myPath & "*.xls")
Do Until fName = ""
Workbooks.Open Filename:=myPath & fName

Dim ws As Worksheet
Dim r As Range
Dim myStr As String
  
myStr = "目印"
  
Set ws = ActiveSheet
Set r = ws.Cells.Find(What:=myStr, LookIn:=xlValues, LookAt:=xlWhole)
  
Set r = r.CurrentRegion
Set r = Intersect(r, r.Offset(2))

r.Copy
  
Worksheets.Add
Range("A65536").End(xlUp).Offset(1).PasteSpecial xlPasteValues

Windows(fName).Close
fName = Dir
Loop

Applicaion.ScreenUpdating = True

End Sub

【79249】Re:複数のファイルに存在する表を抜き出...
発言  マナ  - 17/6/18(日) 23:22 -

引用なし
パスワード
   ▼inoue さん:

>おっしゃる通りにしましたら望みのことができました。
>下記に成功したコードを記載させていただきます。

一つの表に集約したいのではありませんか?
期待通りの結果になっていないと思いますよ。

【79254】Re:複数のファイルに存在する表を抜き出...
発言  inoue  - 17/6/19(月) 21:14 -

引用なし
パスワード
   ▼マナ さん:
>▼inoue さん:
>
>>おっしゃる通りにしましたら望みのことができました。
>>下記に成功したコードを記載させていただきます。
>
>一つの表に集約したいのではありませんか?
>期待通りの結果になっていないと思いますよ。


マナさん

確かに、最終形は一つの表にまとめたかったのですが、
手動で開いて表を一つずつ貼り付けることが
最大のハードルでしたので目的を達した感が強く思わず
解決だと思ってしまいました。

現状、一つのシートに表がいくつもある状態です。
(縦方向は等間隔ではありません。)
特定の文字(数字)が含まれていない行を削除できれば
いいかと思い、下記のようなコードを質問サイトから
拾ってきましたが、こちらで望みのことができそうでしょうか。

retu = "D"
word = InputBox(retu & "列に指定した文字が含まれていない行を削除します。" _
& vbCrLf & "検索する文字を入力してください。")
For i = Range("D" & "65536").End(xlUp).Row To 2 Step -1
If InStr(1, Range(retu & i).Value, word) = 0 Then
Rows(i).Delete
End If
Next i

本日、このコードを試せる環境になく、
また明日結果を報告させていただきます。

648 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free