
この講座を含む定額コースに参加するか、この講座を購入することで、講座を利用できるようになります。
定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
このページへの投稿/コメント
非常に強力!
紙で管理していた帳票がエクセルだけでできちゃいました。(^^)v
フォルダにあるファイルを指定し、処理して保存する。
保存したら処理日を別のシートに入力。
まさにペーパーレス化!便利になります化!
管理も非常に楽になりました♪
ここまでできるのがなにより楽しいです!♪
> ここまでできるのがなにより楽しいです!♪
外部連携まで来ると、マクロ学びはじめのころに比べてかなりのレベルです。
実装までできた自分を大いに讃えまくってください v(^_^*
こういう概念をしっかり理解できているかどうか?というのは、大きな差別化点になります。
ネットで見つけたコードを訳も分からずマネしている人とは、仕事での必要を充足するマクロを書くときのスピード、工数やできあがったマクロの品質に大きな違いが生じます。
ますます楽しんでくださいませ☆
> FSO 概念を理解するのに時間かかりましたが、
> 非常に強力!
> 紙で管理していた帳票がエクセルだけでできちゃいました。(^^)v
> フォルダにあるファイルを指定し、処理して保存する。
> 保存したら処理日を別のシートに入力。
> まさにペーパーレス化!便利になります化!
> 管理も非常に楽になりました♪
> ここまでできるのがなにより楽しいです!♪
コメントするにはログインしてください
for each構文 , instr関数, 動的配列, 再帰呼出 の組み合わせで実現でき、感激です。
>山田 将之 さん:
>
>何をしたいのか?を自分の言葉でまずは表現してみてください。できれば、紙に手書きで書いて。
>それからもう一度、「では、そのためにどうするのか?」という問いを持って動画を見直しましょう。この動画だけでなく、前後にあるものも有効かもしれません。
>
>>再帰がよくわかりませんでした。ここを何とか理解するよう頑張ります。
>
もう一度見たら理解できました。for eachは、exit for でしか途中抜け出さないと思ってたのですが、こんなこともできるんですね。すごいです。
いったん中断して、フォルダがないときはリセットして、end subで終わり、中断していたところに戻って再開する。これで、しっくりきました。end subになったのになぜfor eachの中に戻るかステップインモードで見たとき
頭がこんがらがっていました。解決できて嬉しいです。これは、いろいろなところで応用できますね。ありがとうございます。
発展編1でも、プロシージャの呼び出しについて扱いました。
別プロシージャを呼び出してそっちの処理がはじまるとき、呼び出し元のプロシージャを「抜けだして」いると言えるでしょうか。
「抜け出す」という言葉が何を指すと考えているか?次第ですが、以下に引用した反応から察するに、山田さんが表現する「抜け出す」とはちょっと違いそうですね。
>もう一度見たら理解できました。for eachは、exit for でしか途中抜け出さないと思ってたのですが、こんなこともできるんですね。すごいです。
↑言語能力を高める訓練になると思います。すぐにピンとこないようでしたらじっくり考えてみてください。そういう努力は、山田さんの日ごろのお仕事にも役立つ何かに繋がることでしょう。
Exit Forとプロシージャ呼び出しでの挙動の違いについて比較表を作る等しても理解は深まるかもしれません。
>小川慶一 さん:
>
>>山田 将之 さん:
>>
>>何をしたいのか?を自分の言葉でまずは表現してみてください。できれば、紙に手書きで書いて。
>>それからもう一度、「では、そのためにどうするのか?」という問いを持って動画を見直しましょう。この動画だけでなく、前後にあるものも有効かもしれません。
>>
>>>再帰がよくわかりませんでした。ここを何とか理解するよう頑張ります。
>>
>もう一度見たら理解できました。for eachは、exit for でしか途中抜け出さないと思ってたのですが、こんなこともできるんですね。すごいです。
>いったん中断して、フォルダがないときはリセットして、end subで終わり、中断していたところに戻って再開する。これで、しっくりきました。end subになったのになぜfor eachの中に戻るかステップインモードで見たとき
>頭がこんがらがっていました。解決できて嬉しいです。これは、いろいろなところで応用できますね。ありがとうございます。
>
>山田 将之 さん:
>
>発展編1でも、プロシージャの呼び出しについて扱いました。
>別プロシージャを呼び出してそっちの処理がはじまるとき、呼び出し元のプロシージャを「抜けだして」いると言えるでしょうか。
>
>「抜け出す」という言葉が何を指すと考えているか?次第ですが、以下に引用した反応から察するに、山田さんが表現する「抜け出す」とはちょっと違いそうですね。
>
>>もう一度見たら理解できました。for eachは、exit for でしか途中抜け出さないと思ってたのですが、こんなこともできるんですね。すごいです。
>
>↑言語能力を高める訓練になると思います。すぐにピンとこないようでしたらじっくり考えてみてください。そういう努力は、山田さんの日ごろのお仕事にも役立つ何かに繋がることでしょう。
>Exit Forとプロシージャ呼び出しでの挙動の違いについて比較表を作る等しても理解は深まるかもしれません。
>
>
>
>
>>小川慶一 さん:
>>
>>>山田 将之 さん:
>>>
>>>何をしたいのか?を自分の言葉でまずは表現してみてください。できれば、紙に手書きで書いて。
>>>それからもう一度、「では、そのためにどうするのか?」という問いを持って動画を見直しましょう。この動画だけでなく、前後にあるものも有効かもしれません。
>>>
>>>>再帰がよくわかりませんでした。ここを何とか理解するよう頑張ります。
>>>
>>もう一度見たら理解できました。for eachは、exit for でしか途中抜け出さないと思ってたのですが、こんなこともできるんですね。すごいです。
>>いったん中断して、フォルダがないときはリセットして、end subで終わり、中断していたところに戻って再開する。これで、しっくりきました。end subになったのになぜfor eachの中に戻るかステップインモードで見たとき
>>頭がこんがらがっていました。解決できて嬉しいです。これは、いろいろなところで応用できますね。ありがとうございます。
>>
>小川先生
別プロシージャを呼び出してそっちの処理がはじまるとき、呼び出し元のプロシージャを「抜けだして」いると言えるでしょうか。
いえません。
抜け出す」という言葉が何を指すと考えているか?次第ですが、以下に引用した反応から察するに、山田さんが表現する「抜け出す」とはちょっと違いそうですね。
自分自身を呼び出し、その処理が終わったら呼び出し元に戻るのですね。サブプロシージャ間の連携と基本は同じなんですね。
呼び出し元がfor each の中にあったのがわかりづらかった原因のような気がします。
教えていただきありがとうございます。
コメントするにはログインしてください
受講生さんの投稿
(投稿ID: 4523) 添付ファイルのダウンロード権限がありません
Public Sub XCopy() Dim fmFol As String, toFol As String '参照元フォルダパスを文字列型変数に入れる fmFol = ThisWorkbook.Worksheets("XCopy").Range("B3").Value '参照先フォルダパスを文字列型変数に入れる toFol = ThisWorkbook.Worksheets("XCopy").Range("B6").Value If fmFol = toFol Then MsgBox "参照元と参照先のフォルダーパスが同一のため実行できません。" Exit Sub End If '参照元フォルダパスが\で終わる場合、終了 If Right$(fmFol, 1) = "\" Then MsgBox "参照元フォルダを指定してください。" Exit Sub End If Dim FSO As Scripting.FileSystemObject Set FSO = New Scripting.FileSystemObject If Not (FSO.FolderExists(fmFol)) Then MsgBox "参照元フォルダパスが実在しません。" Exit Sub End If If Not (FSO.FolderExists(toFol)) Then MsgBox "参照先フォルダパスが実在しません。" Exit Sub End If '参照先フォルダパスが\で終わる場合、最後の\を除去 If Right$(toFol, 1) = "\" Then toFol = Left$(toFol, Len(toFol) - 1) End If If MsgBox("フォルダ構成を参照元から参照先にコピーします。" & vbNewLine & _ "よろしいですか?", vbYesNo + vbQuestion) = vbNo Then Exit Sub Dim FolderCol As Collection 'Collectionオブジェクト Set FolderCol = New Collection 'インスタンス化 '参照元フォルダ構成をサーチするサブプロシージャー呼出 RecExplorer fmFol, FSO.GetFolder(fmFol), 0, FolderCol Application.StatusBar = False '参照先フォルダにトップフォルダ作成 If Not (FSO.FolderExists(toFol & Mid$(fmFol, InStrRev(fmFol, "\")))) Then 'フォルダが存在しない場合に作成 FSO.CreateFolder (toFol & Mid$(fmFol, InStrRev(fmFol, "\"))) End If '参照先フォルダに参照元フォルダ構成コピー Dim sFol As Variant On Error GoTo ErrCheck1 For Each sFol In FolderCol 'Collectionオブジェクトから取り出す If Not (FSO.FolderExists(toFol & sFol)) Then 'フォルダが存在しない場合に作成 FSO.CreateFolder (toFol & sFol) End If Next sFol On Error GoTo 0 'エラー処理を通常に戻す Set FolderCol = Nothing Set FSO = Nothing MsgBox "フォルダ構成のコピー完了。" 'Explorer起動 CreateObject("Shell.Application").Open toFol & "\" Exit Sub ErrCheck1: '実行時エラー「ファイルが見つかりません。」(53)は想定内なので無視。 '実行時エラー「パスが見つかりません。」(76)は想定内なので無視。 'それ以外はエラーを発生させる。 If Err.Number <> 53 And Err.Number <> 76 Then Err.Raise Err.Number End If Debug.Print Err.Number Err.Clear Resume Next End Sub
Private Sub RecExplorer(ByRef fmFol As String, _ ByRef f As Folder, _ ByVal n As Integer, _ ByRef Col As Collection) Application.StatusBar = String(n * 2, "-") & f.Name DoEvents Dim Subf As Folder On Error GoTo ErrCheck2 For Each Subf In f.SubFolders '見つかったフォルダパスをCollectionオブジェクトに追加 Col.Add Mid$(fmFol, InStrRev(fmFol, "\")) & Mid$(CStr(Subf), Len(fmFol) + 1) '再帰呼び出し RecExplorer fmFol, Subf, n + 1, Col Next Subf On Error GoTo 0 'エラー処理を通常に戻す Exit Sub ErrCheck2: '実行時エラー「書き込みできません。」(70)は想定内なので無視。 'それ以外はエラーを発生させる。 If Err.Number <> 70 Then Err.Raise Err.Number End If Debug.Print Err.Number Err.Clear On Error GoTo 0 'エラー処理を通常に戻す End Sub
コメントするにはログインしてください