Excel VBA質問箱 IV

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

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


8706 / 13644 ツリー ←次へ | 前へ→

【31642】VBでファイルを開くときに... kon 05/11/27(日) 18:33 質問[未読]
【31644】Re:VBでファイルを開くときに... かみちゃん 05/11/27(日) 18:53 発言[未読]
【31648】Re:VBでファイルを開くときに... kon 05/11/27(日) 19:07 質問[未読]
【31651】Re:VBでファイルを開くときに... かみちゃん 05/11/27(日) 19:17 発言[未読]
【31655】Re:VBでファイルを開くときに... kon 05/11/27(日) 19:55 発言[未読]
【31657】Re:VBでファイルを開くときに... かみちゃん 05/11/27(日) 20:12 発言[未読]
【31658】Re:VBでファイルを開くときに... kon 05/11/27(日) 20:40 発言[未読]
【31659】Re:VBでファイルを開くときに... かみちゃん 05/11/27(日) 20:50 回答[未読]
【31660】Re:VBでファイルを開くときに... kon 05/11/27(日) 21:41 お礼[未読]
【31668】Re:VBでファイルを開くときに... OYAJI 05/11/27(日) 23:46 質問[未読]
【31669】Re:VBでファイルを開くときに... かみちゃん 05/11/28(月) 6:43 回答[未読]
【31670】Re:VBでファイルを開くときに... つつ 05/11/28(月) 8:05 質問[未読]
【31678】Re:VBでファイルを開くときに... かみちゃん 05/11/28(月) 11:12 回答[未読]
【31680】Re:VBでファイルを開くときに... つつ 05/11/28(月) 12:00 お礼[未読]

【31642】VBでファイルを開くときに...
質問  kon  - 05/11/27(日) 18:33 -

引用なし
パスワード
   はじめましてkonです。

マクロの自動書きで別ファイルを呼び出しできるように
したのですが、このファイル名は固定せずセルに入力
されている各ファイル名から呼出できるようにしたいです。

ファイル名だけでも100以上あるので自動書きだけでは
作業の効率があがりません。

変数?とでもいうのでしょうか。何か代入できるものはある
のですか。あればその方法を教えてください。

私は自動でしかマクロを作成したことがありません。
宜しくお願いします。


【31644】Re:VBでファイルを開くときに...
発言  かみちゃん  - 05/11/27(日) 18:53 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>マクロの自動書きで別ファイルを呼び出しできるように
>したのですが、このファイル名は固定せずセルに入力
>されている各ファイル名から呼出できるようにしたいです。

「マクロの自動書き」というのは、「マクロの記録」を使ったということでしょうか?
それであれば、その記録したマクロとファイル名を記述したセルのサンプルを提示
できませんか?

>変数?とでもいうのでしょうか。何か代入できるものはある
>のですか。あればその方法を教えてください。

実際の処理とは少し違いますが、こんな感じでできると思います。

Sub Macro1()
 Dim LastCell As Range, c As Range
 
 Set LastCell = Range("A65536").End(xlUp)
 For Each c In Range("A1", LastCell)
  strFileName = c.Value
  If c.Value <> "" And Dir(strFileName) <> "" Then
   '〜ファイル呼び出し〜
   c.Offset(, 1).Value = "成功"
  Else
   c.Offset(, 1).Value = "失敗"
  End If
 Next
 Range("A1").Select
 Set LastCell = Nothing
End Sub

【31648】Re:VBでファイルを開くときに...
質問  kon  - 05/11/27(日) 19:07 -

引用なし
パスワード
   ▼かみちゃん さん:
早速の返信ありがとうございます。

>「マクロの自動書き」というのは、「マクロの記録」を使ったということでしょうか?
そうです。

>それであれば、その記録したマクロとファイル名を記述したセルのサンプルを提示
>できませんか?

ファイル名はセルに入力してあり
マクロを実行するとそのファイルが開くというものです。
ちなみに「マクロの記録」では下記の記述となりました。

Workbooks.Open Filename:="C:\WINDOWS\デスクトップ\1234567.xls"

この「1234567.xls」部分をセルに入力されている内容を自動で読み込みたいのです。

【31651】Re:VBでファイルを開くときに...
発言  かみちゃん  - 05/11/27(日) 19:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ファイル名はセルに入力してあり
>マクロを実行するとそのファイルが開くというものです。
>ちなみに「マクロの記録」では下記の記述となりました。
>
>Workbooks.Open Filename:="C:\WINDOWS\デスクトップ\1234567.xls"
>
>この「1234567.xls」部分をセルに入力されている内容を自動で読み込みたいのです。

A列に開きたいファイル名が記述してある場合、以下のような感じでできますが、
ブックを開きっぱなしになるので、危険なコードになっています。
でも、開いた後、どうしたいのかがわかりませんので・・・

Sub Macro1()
 Dim LastCell As Range, c As Range

 Set LastCell = Range("A65536").End(xlUp)
 For Each c In Range("A1", LastCell)
  strFileName = "C:\WINDOWS\デスクトップ\" & c.Value
  If c.Value <> "" And Dir(strFileName) <> "" Then
   'ファイル呼び出し
   Workbooks.Open Filename:="C:\WINDOWS\デスクトップ\" & c.Value
   '???開いたあとどうしたいのか???
   c.Offset(, 1).Value = "成功"
  Else
   c.Offset(, 1).Value = "失敗"
  End If
 Next
 Range("A1").Select
 Set LastCell = Nothing
End Sub

【31655】Re:VBでファイルを開くときに...
発言  kon  - 05/11/27(日) 19:55 -

引用なし
パスワード
   かみちゃんさん

ファイルは単純に開いて閲覧したいだけなので開いた状態のままで
問題ありません。閉じるときは手動で閉じます。

この程度ですので先ほどのVBのような「成功・失敗」のような
メッセージは特に必要ありません。

再度ご教示願います。

【31657】Re:VBでファイルを開くときに...
発言  かみちゃん  - 05/11/27(日) 20:12 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ファイルは単純に開いて閲覧したいだけなので開いた状態のままで
>問題ありません。閉じるときは手動で閉じます。

1回のマクロ実行で100以上あるファイルを一度に開いてしまいます(厳密には、順番に開いていく)が、大丈夫ですか?

>この程度ですので先ほどのVBのような「成功・失敗」のような
>メッセージは特に必要ありません。
>
>再度ご教示願います。

であれば、その記述されているコードを削除すればいいだけだと思いますが・・・

いらないこと書いてすみません。(記述ミスなどによるファイルの存在チェックのためにあったほうがいいかなと思っただけです。)

再度、申し上げますが、一回のマクロ実行で、A列に記述されたファイル名はすべて開く処理をしますので、
マクロ実行後には、たくさんのブックが開かれていることになりますので、くれぐ
れも注意してください。(そもそも耐えられるかどうか心配です。)

【31658】Re:VBでファイルを開くときに...
発言  kon  - 05/11/27(日) 20:40 -

引用なし
パスワード
   かみちゃんさん

たぶんっていうかメモリーがもちませんね。
では、各ファイル名はリストにしておいて
開きたいファイルをそのリストより1つだけ選択し
てマクロを走らせる場合は同なのでしょうか?

リストはA列に作成しておき、任意のファイル名はB1セルに
1つだけ手動で貼り付けしておきます。その後マクロ実行です。

先ほどのVBを変更すればできますか?それとももっと簡素化
できるのでしょうか?

【31659】Re:VBでファイルを開くときに...
回答  かみちゃん  - 05/11/27(日) 20:50 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>では、各ファイル名はリストにしておいて
>開きたいファイルをそのリストより1つだけ選択し
>てマクロを走らせる場合はどうなのでしょうか?

開きたいファイルの名が書かれている行のB列に「*」という文字を入れておいて
その文字が入力してある場合は、その行のA列に書かれているファイル名を開くと
いうのではいかがでしょうか?

さきほどのVBAコードの
  If c.Value <> "" And Dir(strFileName) <> "" Then
の部分を
  If c.Value <> "" And c.Offset(, 1).Value = "*" And Dir(strFileName) <> "" Then
という記述にすれば、できます。

本当は、ファイルを開くことができたならば、「処理したよ」という意味の表示を
B列に出力したいところですが・・・必要ないですよね。すみません。

【31660】Re:VBでファイルを開くときに...
お礼  kon  - 05/11/27(日) 21:41 -

引用なし
パスワード
   かみちゃん

ありがとうございます。
早速やってみます。

【31668】Re:VBでファイルを開くときに...
質問  OYAJI  - 05/11/27(日) 23:46 -

引用なし
パスワード
   私も似た質問です。便乗させてください。

私の場合は、単純にファイルが開ければいいので
ファイル名が入力されているセルは1つだけであり
リストのようなものはありません。

ファイル名はその都度入力しています。

konさん勝手にすみません。
かみちゃんさん教えていただけますか。

【31669】Re:VBでファイルを開くときに...
回答  かみちゃん  - 05/11/28(月) 6:43 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>私の場合は、単純にファイルが開ければいいので
>ファイル名が入力されているセルは1つだけであり
>リストのようなものはありません。
>
>ファイル名はその都度入力しています。

ファイル名が入力されているセルがA1である場合、
先に提示したコードを流用するならば、
 Set LastCell = Range("A65536").End(xlUp)

 Set LastCell = Range("A1")
とするだけでいいです。

ただ、入力されているセルが1つだけですので、For 〜 Nextを使う必要はまったく
ありませんので、

Sub Macro1()
 Dim strFileName As String

 strFileName = "C:\WINDOWS\デスクトップ\" & Range("A1").Value
 If Dir(strFileName) <> "" Then
  'ファイル呼び出し
  Workbooks.Open Filename:=strFileName
  '???開いたあとどうしたいのか???
 End If
End Sub

とすればいいです。

さらに、セルに入力せずに、「ファイルを開く」ダイアログボックスを表示して
その都度選択させるということもできます。
その場合は、GetOpenFilaNameメソッドをヘルプで調べてみてください。

【31670】Re:VBでファイルを開くときに...
質問  つつ  - 05/11/28(月) 8:05 -

引用なし
パスワード
   私も乱入させてください。
konさんすみません。

>さらに、セルに入力せずに、「ファイルを開く」ダイアログボックスを表示して
>その都度選択させるということもできます。
>その場合は、GetOpenFilaNameメソッドをヘルプで調べてみてください。

GetOpenFileNameメソッド、大変役に立ちました。
以前からエクセルマクロ4を使用し、VBAに移行しつつあるのですが
このメソッドがわからないため、一変通りのことしか
できない状態でしたが、これで、自由にファイル内容を
取り出すことに成功しました。

そうしたらまた問題が出ました。
開いたファイルから内容をコピーし、別のワークブックにペーストした後
開いたファイルを閉じたいのですが、エラーが出てしまいます。
以下のように記述しているのですがどこがおかしいのでしょうか?
  fileToOpen = Application.GetOpenFilename("CSV形式 (*.csv), *.csv")
  If fileToOpen <> False Then
    MsgBox "選択されたファイル : " & fileToOpen
  Workbooks.Open Filename:=fileToOpen
  Columns("B:B").Select
  Selection.Copy
  Windows("Book1.xls").Activate
  Range("C1").Select
  ActiveSheet.Paste
  Application.Workbooks(fileToOpen).Activate
  ActiveWindow.Close
  End If
よろしくお教えください。

【31678】Re:VBでファイルを開くときに...
回答  かみちゃん  - 05/11/28(月) 11:12 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>開いたファイルから内容をコピーし、別のワークブックにペーストした後
>開いたファイルを閉じたいのですが、エラーが出てしまいます。

とりあえず、以下のような感じでできると思います。
★印の行を追加修正しています。

Sub test()
  fileToOpen = Application.GetOpenFilename("CSV形式 (*.csv), *.csv")
  If fileToOpen <> False Then
   MsgBox "選択されたファイル : " & fileToOpen
   Workbooks.Open Filename:=fileToOpen
   OpenWorkbookName = ActiveWorkbook.Name '★
   Columns("B:B").Select
   Selection.Copy
   Workbooks("Book1").Activate '★
   Range("C1").Select
   ActiveSheet.Paste
   Application.CutCopyMode = False '★
   Workbooks(OpenWorkbookName).Activate '★ 変数fileToOpenにはフルパスが格納されている
   ActiveWindow.Close
  End If
End Sub

ただ、Book1は、常に開いている状態なのでしょうか?
CSVファイルを開いたら、新規ブックの追加をして、そのブックに貼り付けて
終わったら、CSVファイルは閉じるという方法にしてはいかがでしょうか?
そのためには、以下のような感じになります。

Sub test0()
  Dim fileToOpen As String
  Dim wb1 As Workbook, wb2 As Workbook
  Dim ws As Worksheet
 
  fileToOpen = Application.GetOpenFilename("CSV形式 (*.csv), *.csv")
  If fileToOpen <> "False" Then
   MsgBox "選択されたファイル : " & fileToOpen

   Set wb1 = Workbooks.Open(fileToOpen)
   Set ws = ActiveSheet
   Set wb2 = Workbooks.Add

   ws.Columns("B:B").Copy Range("C1")
   wb1.Close

   Set wb1 = Nothing
   Set ws = Nothing
   Set wb2 = Nothing

  End If
End Sub

【31680】Re:VBでファイルを開くときに...
お礼  つつ  - 05/11/28(月) 12:00 -

引用なし
パスワード
   ▼かみちゃん さん:

大変ありがとうございます。

> 変数fileToOpenにはフルパスが格納されている

なるほど、そういうことだったですね。
納得納得!

>ただ、Book1は、常に開いている状態なのでしょうか?
>CSVファイルを開いたら、新規ブックの追加をして、そのブックに貼り付けて
>終わったら、CSVファイルは閉じるという方法にしてはいかがでしょうか?

提示のものは、単純化しており、実際にはBook1はフォーマットのように
使用して、コピーしては、次の列に貼り付けて列を足していく
形にしようと考えています。
ペーストコマンドの前に右にずらすという操作を挿入して
使用します。
従って、Book1は閉じることなく運用したいと思います。

それと提示していただいたもの、すっきりしていて
とても参考になります。短い単語の変数を定義することで
わかりやすいですね。こちらも採用してみるつもりです。

個人的にVBAを活用して楽にすすめるには、このHP、
非常にありがたいです。今回初めて、見させていただきました。
かみちゃんさん、本当にありがとうございました。

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