Excel VBA質問箱 IV

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

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


11687 / 13646 ツリー ←次へ | 前へ→

【14730】データの入出力 to 04/6/6(日) 15:20 質問[未読]
【14731】Re:データの入出力 ちゃっぴ 04/6/6(日) 15:25 発言[未読]
【14732】Re:データの入出力 to 04/6/6(日) 15:41 回答[未読]
【14734】Re:データの入出力 ちゃっぴ 04/6/6(日) 15:52 回答[未読]
【14737】Re:データの入出力 ちゃっぴ 04/6/6(日) 15:57 回答[未読]
【14738】Re:データの入出力 to 04/6/6(日) 16:34 質問[未読]
【14741】Re:データの入出力 ちゃっぴ 04/6/6(日) 16:51 回答[未読]
【14743】Re:データの入出力 to 04/6/6(日) 17:19 質問[未読]
【14752】Re:データの入出力 ちゃっぴ 04/6/6(日) 22:04 回答[未読]
【14753】Re:データの入出力 to 04/6/6(日) 22:49 お礼[未読]
【14754】Re:データの入出力 ちゃっぴ 04/6/7(月) 1:31 発言[未読]

【14730】データの入出力
質問  to  - 04/6/6(日) 15:20 -

引用なし
パスワード
   はじめまして。
初心者ですのでよろしくお願いします。

【課題】
あるフォルダにある複数ファイルの中のデータを抽出し、別ファイルに入力する。

という課題があり、ファイル選択ダイアログを表示させ、ユーザーにファイルを選択させるという方法をとろうとしています。
フォルダ内にあるファイルをBook1.xls
マクロ専用ファイルをBook2.xls
入力用ファイルをBook3.xls
という3ファイルを使用します。
ようは、Book2.xlsファイルでボタンを押すとダイアログが表示されBook1.xlsファイル(複数可)を選択し、「開く」ボタンを押すと処理が実行され、Book3.xlsにBook1.xlsから抽出したデータが入力されるというものです。
選択ダイアログを表示させるまでは出来たのですが、選択したファイルを開くことが出来ません。

どうすればいいのでしょうか?
よろしくお願いします。
ちなみに環境はofficeXPです。

【14731】Re:データの入出力
発言  ちゃっぴ  - 04/6/6(日) 15:25 -

引用なし
パスワード
   >選択ダイアログを表示させるまでは出来たのですが、選択したファイルを開くことが出来ません。

とりあえず、出来たソースを公開してみてはいかがでしょうか?

【14732】Re:データの入出力
回答  to  - 04/6/6(日) 15:41 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>>選択ダイアログを表示させるまでは出来たのですが、選択したファイルを開くことが出来ません。
>
>とりあえず、出来たソースを公開してみてはいかがでしょうか?

>ちゃっぴさん

ご指摘どうもありがとうございます。
お恥ずかしいですが、一部を公開します。。。

Dim FileToOpen   As Variant
Dim w_Fiter  As String

w_Filter = "xls ファイル(*.xls),*.xls"

FileToOpen = Application.GetOpenFilenae( _
       FileFilter = w_Filter,
       Title:="対象ファイル選択", _
       MultiSelect:=True)

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

【14734】Re:データの入出力
回答  ちゃっぴ  - 04/6/6(日) 15:52 -

引用なし
パスワード
   GetOpenFilenameはMultiSelectをTrueにするとファイル名の
バリアント型の配列を返します。

従って、「For 〜 Nextステートメント」か「For Each 〜 Nextステートメント」
で配列を一件ずつループしてやる必要があります。

ループの中でWorkbooks.Openを実行してやればできると思います。

なお、タイプミスしてますよ!
GetOpenFilenae→GetOpenFilename

あと、GetOpenFilenameはMultiSelectがTrueの場合、
条件付書式が設定されているシート上で実行すると、
正常に動作しませんのでお気をつけください。

【14737】Re:データの入出力
回答  ちゃっぴ  - 04/6/6(日) 15:57 -

引用なし
パスワード
   またまた発見してしまいました(^^;)
FileFilter = w_Filter
     ↓
FileFilter:= w_Filter

「:」が抜けてます。

【14738】Re:データの入出力
質問  to  - 04/6/6(日) 16:34 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>またまた発見してしまいました(^^;)
>FileFilter = w_Filter
>     ↓
>FileFilter:= w_Filter
>
>「:」が抜けてます。


▼ちゃっぴ さん
たびたびご指摘ありがとうございます。
タイプミスすいません・・・

さて早速試してみましたが、
型が一致しませんとエラーが出てしまいます。
おそらくものすごく単純なことだと思うのですが、
初めて、プログラムを組んでいるのでわかりません。
よろしくお願いします。

Dim FileToOpen   As Variant
Dim w_Fiter  As String
Dim i  As Integer

w_Filter = "xls ファイル(*.xls),*.xls"

FileToOpen = Application.GetOpenFilename( _
       FileFilter:=w_Filter,
       Title:="対象ファイル選択", _
       MultiSelect:=True)

  For i = 1 To 2000

  Workbook.Open FileToOpen  ←ここでエラーが出ます。

  Next

【14741】Re:データの入出力
回答  ちゃっぴ  - 04/6/6(日) 16:51 -

引用なし
パスワード
   > GetOpenFilenameはMultiSelectをTrueにするとファイル名の
> バリアント型の配列を返します。

> 従って、「For 〜 Nextステートメント」か「For Each 〜 Nextステートメント」
> で配列を一件ずつループしてやる必要があります。

ということなので

Dim vntFilename As Variant

For Each vntFilename In FileToOpen
  Workbooks.Open vntFilename
Next vntFilename

のようにしてみてください。
ヘルプで「For Each...Next ステートメントの使い方」を参照してみてください。

【14743】Re:データの入出力
質問  to  - 04/6/6(日) 17:19 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>> GetOpenFilenameはMultiSelectをTrueにするとファイル名の
>> バリアント型の配列を返します。
>
>> 従って、「For 〜 Nextステートメント」か「For Each 〜 Nextステートメント」
>> で配列を一件ずつループしてやる必要があります。
>
>ということなので
>
>Dim vntFilename As Variant
>
>For Each vntFilename In FileToOpen
>  Workbooks.Open vntFilename
>Next vntFilename
>
>のようにしてみてください。
>ヘルプで「For Each...Next ステートメントの使い方」を参照してみてください。


▼ちゃっぴ さん

出来ました!どうもありがとうございます。
そこで当初の質問に戻るのですが、その選択したファイルからデータをコピーして
別ファイルに出力するようにしたいのです。
お手数おかけしますが引き続きお願いします。
コピーして別ファイルに出力するソースを公開します。


Const INBOOK  As String = "Book1.xls"
Const INSHEET  As String = "insheet1"
Const OUTBOOK  As String = "Book3.xls"
Const OUTSHEET As String = "outsheet1"
Const INSHEET2 As String = "insheet2"

Private Sub CommandButton1_Click()

  
  Workbooks(INBOOK).Worksheets(INSHEET).Range("D40,F40:K40,O40,AM40").Copy
  
    Workbooks("Book3.xls").Worksheets("Sheet2").Range("B2").PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
  
  
  Workbooks(INBOOK).Worksheets(INSHEET2).Range("M4,AT4,AU4,BB4,BC4,BD4,BE4").Copy
  
    Workbooks("Book3.xls").Worksheets("Sheet2").Range("B4").PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
   
  
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 2).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(3, 19).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 3).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 6).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 4).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 7).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 5).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 9).PasteSpecial xlPasteAll
 
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 6).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 10).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 7).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 12).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 9).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 13).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(2, 10).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(14, 4).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
            
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 2).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(38, 11).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
            
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 3).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 18).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False
      
  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 4).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 19).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False

  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 5).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 2).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False

  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 6).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 3).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False

  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 7).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 20).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False

  Workbooks("Book3.xls").Worksheets("Sheet2").Cells(4, 8).Copy
  
    Workbooks(OUTBOOK).Worksheets(OUTSHEET).Cells(6, 21).PasteSpecial xlPasteAll
  
      Application.CutCopyMode = False


  MsgBox "終了・・・"
      
End Sub

【14752】Re:データの入出力
回答  ちゃっぴ  - 04/6/6(日) 22:04 -

引用なし
パスワード
   ではヒントを・・・

Dim vntFilename As Variant
Dim wbkOpenBook As Workbook

For Each vntFilename In FileToOpen
  Set wbkOpenBook = Workbooks.Open vntFilename
  wbkOpenBook.WorkSheets("Sheet2").Range("A1").copy _
    Destination:=Workbooks("Book2.xls").Worksheets("Sheet1").Range("A1")
  wbkOpenBook.close
Next vntFilename

このように開いたブックはオブジェクト型の変数に代入することが出来ます。

ヘルプを参照するなり、ちょっと考えてみてね☆

【14753】Re:データの入出力
お礼  to  - 04/6/6(日) 22:49 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>ではヒントを・・・
>
>Dim vntFilename As Variant
>Dim wbkOpenBook As Workbook
>
>For Each vntFilename In FileToOpen
>  Set wbkOpenBook = Workbooks.Open vntFilename
>  wbkOpenBook.WorkSheets("Sheet2").Range("A1").copy _
>    Destination:=Workbooks("Book2.xls").Worksheets("Sheet1").Range("A1")
>  wbkOpenBook.close
>Next vntFilename
>
>このように開いたブックはオブジェクト型の変数に代入することが出来ます。
>
>ヘルプを参照するなり、ちょっと考えてみてね☆


ありがとうございます!
何とかできました。
もう少し改良を加えて使いやすいようにします。
本当にありがとうございました。

【14754】Re:データの入出力
発言  ちゃっぴ  - 04/6/7(月) 1:31 -

引用なし
パスワード
   toさんへ

こちらの板はマルチポストOKですが、他の板はマルチポストNGなので気をつけましょう!

私はたいして、気にしませんが、気にする人多いみたいなので・・・

HN変えても質問同じならわかりますよ。
解決したなら、あちらも解決にするべきだと思います。

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