- ホーム
- 講座一覧
- 講座「エクセルVBA外部連携講座」
- 教材「ファイルの操作・フォルダの操作説明」
ファイルの操作・フォルダの操作説明
解説
この教材についての過去の質問・感想
12821 : たかちゃんさんのコメント (2021-01-14 02:46:56)
小川先生、田中さん
すみません。ありがとうございました。
MsoTriState...どこかで見かけましたが、コメントを読んで意味が分かりました。
自分の備忘録として、また
簡単に実現できるシンプルなプログラムの場合は
いつか誰かのお役に立てそうかなと思って投稿しました。
声をかけて貰えるだけで嬉しいです。
お手間を取らせてしまい、すみません。(^^;
次回はcsvファイルを読んで作業する良い例題を見つけたので
それに挑戦しようと思います。
ネットにあるコードや他の生徒さんのコードを読むのは
本当に勉強になります。
まだ理解できないコードも多いですが、実践で困らないように
少しづつ技を増やしていきたいです。
> もしも、「どうしてもコメントしてくれ」と言われることがあるとしたら、AddPicture メソッドのリファレンスで、「LinkToFile, SaveWithDocumentの値にはMsoTriState列挙体を使う」と書かれているので、以下のようにリライトしてもいいかな、というくらい。
12811 : 小川慶一の回答 (2021-01-13 10:55:59)
田中 宏明さん:
> すご過ぎてコメントが思いつきません。
ですね。。
もしも、「どうしてもコメントしてくれ」と言われることがあるとしたら、AddPicture メソッドのリファレンスで、「LinkToFile, SaveWithDocumentの値にはMsoTriState列挙体を使う」と書かれているので、以下のようにリライトしてもいいかな、というくらい。
ビルトインの定数を使うと、可読性が高まる場合があります。
とはいえ、今回の例ではそんなことはなく、むしろ仰々しすぎる感じがあります。True/Falseで表現するほうが分かりやすい気がしますし、あえてそうされたのかなとも思いますが...あとからこの投稿を読まれる方向けのmsgという意味も込めてあえてその旨ここに記しておきます。
ws.Shapes.AddPicture _ Filename:=objFile, _ LinkToFile:=MsoTriState.msoFalse, _ SaveWithDocument:=MsoTriState.msoTrue, _ Left:=20, _ Top:=lngTop, _ Width:=300, _ Height:=200 ws.Shapes.AddPicture _ Filename:=objFile, _ LinkToFile:=msoFalse, _ SaveWithDocument:=msoTrue, _ Left:=20, _ Top:=lngTop, _ Width:=300, _ Height:=200
Shapes. AddPicture メソッド (Excel)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.shapes.addpicture
MsoTriState列挙体
https://docs.microsoft.com/ja-jp/office/vba/api/office.msotristate
12810 : 田中 宏明さんのコメント (2021-01-12 22:16:28)
12809 : 小川慶一の回答 (2021-01-12 22:06:56)
12806 : たかちゃんさんのコメント (2021-01-12 11:30:27)
ファイルシステムオブジェクトを使用して、エクセルに写真を張り付け
工事現場の作業報告書のようなものを作成してみました。
事前準備:
エクセルでは”ひな形”という名前のシートを作成し、全てのセルの高さ20に設定。
写真の横にコメントを書ける罫線を引くなどしておく。
ひな形シートをコピーして、指定フォルダの写真を3枚貼り
再び、ひな形シートをコピーして、指定フォルダの残りの写真を
3枚づつ貼っていくマクロです。
Excel2019で動作確認済み。記念に投稿させて頂きました。
'Microsoft Scripting Runtimeにチェック→FSOを使用する為 Sub 画像貼り付け() Dim lngTop As Long 'TOPの余白用 Dim fs As FileSystemObject Dim objFile As Scripting.File Dim objFldr As Scripting.Folder Dim c As Long '写真貼り付けのカウント用 Dim cFiles As Long 'ファイルの数 Dim cLast As Long '最後の3の倍数用 Dim ws As Worksheet '作業用ワークシート Set fs = New Scripting.FileSystemObject Set objFldr = fs.GetFolder(ThisWorkbook.Path & "\写真") '最初は、写真を貼るシートをコピーする Worksheets("ひな形").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = Format(Date, "yymmdd") Set ws = ActiveSheet c = 1 '写真を貼り付けるカウント用 lngTop = 20 '写真貼の際、Topの余白を20の意味 cFiles = objFldr.Files.Count 'フォルダの中のファイル数 'A4 1枚に3枚づつ写真を貼り付ける。最後の3の倍数では 'シート(ページ)を追加したくない為、ここで最後の3の倍数を確認 If cFiles Mod 3 = 0 Then cLast = (cFiles \ 3) * 3 End If '写真を貼り付け For Each objFile In objFldr.Files ws.Shapes.AddPicture _ Filename:=objFile, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=20, _ Top:=lngTop, _ Width:=300, _ Height:=200 lngTop = lngTop + 200 + 20 '3回写真を貼ったら、次のページ(シート)を作成 '但し、最後の3の倍数ではページ(シート)を作成しない If c Mod 3 = 0 And c <> cLast Then Worksheets("ひな形").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = Format(Date, "yymmdd") & "_" & c Set ws = ActiveSheet lngTop = 20 End If c = c + 1 Next Set objFile = Nothing Set objFldr = Nothing Set fs = Nothing End Sub
10029 : 小川慶一の回答 (2018-05-21 18:44:19)
あじろうさん:
試しに、エクセルのメニューから新規作成やファイルを作り、それに、(よけいな組織等の設定は行わず)数値や文字日付等の情報だけを入れたシートを作ってみてください。
そのようなファイルを複数作り、それらの中身を読み取るマクロを書いて実行してみてください。
その結果と今回書いたマクロでの実行結果等を比べれば何か分るでしょう。
> いつも何気ない質問にお答えいただけるガラパゴスタディーに感謝です。
教科書的な話だけをするのは簡単ですが、実務ではいろいろな課題がありますからね。
今後とも、まずは、お気軽にいろいろ聞いてみてください。
9997 : あじろうさんのコメント (2018-05-17 00:04:27)
小川慶一さん:
返信ありがとうございます。
いつも何気ない質問にお答えいただけるガラパゴスタディーに感謝です。
開くファイルは重たくはないと思います。
普通に考えれば処理速度はそれほど遅くはないのかもしれません。
基礎編から始めて長く勉強していくうちに良い意味で麻痺しているかもしれません。もう少し講座を進めていくうちに気付くこともあるかと思います。また、疑問に思うことがありましたら質問させていただきます。
ありがとうございます。
> あじろうさん:
>
> ソース拝見しました。
>
> これなら、一瞬で処理は終わるはずですけどね。
>
>
Option Explicit > Sub FileExists() > Dim fs As Scripting.FileSystemObject > Dim fname, st As String > Dim c As Long > Dim wb As Workbook > Debug.Print Now & "開始" > Set fs = CreateObject("Scripting.FileSystemObject") > Application.DisplayAlerts = False > Workbooks("syuukei").Worksheets("Sheet1").Range("A1").ClearContents > For c = 1 To 5 > fname = ThisWorkbook.Path & "\siken\" & c & ".xlsm" > If fs.FileExists(filespec:=fname) Then > Workbooks.Open filename:=fname > Set wb = ActiveWorkbook > st = st & wb.Worksheets("Sheet1").Range("A1").Value > wb.Close > End If > Next > Workbooks("syuukei").Worksheets("Sheet1").Range("A1").Value = st > Application.DisplayAlerts = False > Set fs = Nothing > Debug.Print Now & "終了" > End Sub
>
> 開けた先のファイルがよほど重たいとかですか?
> その場合は、手作業でファイルを開いても時間がかかりそうですが。
>
>
> > いつもお世話になっております。
> > 処理時間について教えてもらいたいことがあります。
> > 今迄、日ごとに分けたファイルから情報をあつめて集計しようと考えてます。
> > FileSystemObjectのサンプルコードを参考にして書いてみたコードがあります。
> > "siken"ファイルに"1.xlsm","3.xlsm""4.xlsm"3個が存在していて有無を確認した後、あったらSheet1の”A1”の値を "syuukei"シートに書き出す処理をしてみました。
> > 僅か3個の処理で2~3秒かかってます。コードの描き方がいけないのでしょうか?それともこのくらいはかかるものでしょうか?うまく説明できずすいません。よろしくお願いします。
> >
9985 : 小川慶一の回答 (2018-05-16 08:01:04)
あじろうさん:
ソース拝見しました。
これなら、一瞬で処理は終わるはずですけどね。
Option Explicit Sub FileExists() Dim fs As Scripting.FileSystemObject Dim fname, st As String Dim c As Long Dim wb As Workbook Debug.Print Now & "開始" Set fs = CreateObject("Scripting.FileSystemObject") Application.DisplayAlerts = False Workbooks("syuukei").Worksheets("Sheet1").Range("A1").ClearContents For c = 1 To 5 fname = ThisWorkbook.Path & "\siken\" & c & ".xlsm" If fs.FileExists(filespec:=fname) Then Workbooks.Open filename:=fname Set wb = ActiveWorkbook st = st & wb.Worksheets("Sheet1").Range("A1").Value wb.Close End If Next Workbooks("syuukei").Worksheets("Sheet1").Range("A1").Value = st Application.DisplayAlerts = False Set fs = Nothing Debug.Print Now & "終了" End Sub
開けた先のファイルがよほど重たいとかですか?
その場合は、手作業でファイルを開いても時間がかかりそうですが。
> いつもお世話になっております。
> 処理時間について教えてもらいたいことがあります。
> 今迄、日ごとに分けたファイルから情報をあつめて集計しようと考えてます。
> FileSystemObjectのサンプルコードを参考にして書いてみたコードがあります。
> "siken"ファイルに"1.xlsm","3.xlsm""4.xlsm"3個が存在していて有無を確認した後、あったらSheet1の”A1”の値を "syuukei"シートに書き出す処理をしてみました。
> 僅か3個の処理で2~3秒かかってます。コードの描き方がいけないのでしょうか?それともこのくらいはかかるものでしょうか?うまく説明できずすいません。よろしくお願いします。
>
9966 : あじろうさんのコメント (2018-05-14 00:55:23)
いつもお世話になっております。
処理時間について教えてもらいたいことがあります。
今迄、日ごとに分けたファイルから情報をあつめて集計しようと考えてます。
FileSystemObjectのサンプルコードを参考にして書いてみたコードがあります。
"siken"ファイルに"1.xlsm","3.xlsm""4.xlsm"3個が存在していて有無を確認した後、あったらSheet1の”A1”の値を "syuukei"シートに書き出す処理をしてみました。
僅か3個の処理で2~3秒かかってます。コードの描き方がいけないのでしょうか?それともこのくらいはかかるものでしょうか?うまく説明できずすいません。よろしくお願いします。
5563 : 小川慶一の回答 (2016-01-11 12:45:50)
山田 将之 さん:
よくある悩みです。
原理原則が分かれば簡単に理解できることでも、表面だけ追いかけていると分かりませんね。
>サンプルを抜き取って使ってたファイルとフォルダーの操作でしたが、その中身を完全に、理解していませんでした。ですので、基本からわかりやすく説明してもらい本当に助かります。
5546 : 山田 将之さんのコメント (2016-01-10 09:23:41)

本講座の動画一覧
-
【動画1】 これから取り扱うトピックを説明
-
【動画2】 クラスとインスタンス、外部ライブラリの参照
-
【動画3】 「クラス」と「インスタンス」について
-
【動画4】 クラスの連携について
-
【動画5】 「クラス」と「インスタンス」の生成を体験
-
【動画6】 「New キーワード」と 「固有オブジェクト型での変数宣言とそのメリット」について
-
【動画7】 外部ライブラリの参照について1
-
【動画8】 外部ライブラリの参照について2
-
【動画9】 ファイルの操作・フォルダの操作説明
-
【動画10】 フォルダ内のサブフォルダとファイルをリストアップ
-
【動画11】 テキストファイルの操作について
-
【動画12】 文字列操作の一例を紹介
-
【動画13】 データベース接続を簡単に実現する外部ライブラリについて
-
【動画14】 データベースとの接続と接続解除について
-
【動画15】 Openメソッドについて
-
【動画16】 カレントレコードについて
-
【動画17】 簡単なSQL を使った.mdb ファイルからデータを取得するサンプルについて
-
【動画18】 ORDER BYの紹介
-
【動画19】 データベースの更新について
-
【動画20】 既存レコード内容の削除とデータリンクファイルによる接続について
-
【動画21】 Office アプリケーションを操作・連携するには
-
【動画22】 PowerPoint の主要オブジェクト紹介
-
【動画23】 Excel の表を貼り付けるには
-
【動画24】 Wordと連携するには
-
【動画25】 文書中の一文を操作するには
コメント紹介
もっと見る