<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>エクセル</title>
	<atom:link href="https://javeo.jp/tag/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Fri, 04 Oct 2024 15:13:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2025/08/cropped-ExcelPython_future-32x32.jpg</url>
	<title>エクセル</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【VBA】再帰処理について解説</title>
		<link>https://javeo.jp/recursion-processing/</link>
					<comments>https://javeo.jp/recursion-processing/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 16 Jul 2024 23:00:00 +0000</pubDate>
				<category><![CDATA[VBA・Excel]]></category>
		<category><![CDATA[EXCEL]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[エクセル]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=2478</guid>

					<description><![CDATA[目次 再帰処理とはサンプルプログラム再帰処理のイメージ再帰処理のメリット・デメリットメリットデメリットあとがき 再帰処理とは 一言で表すと関数やプロシージャが自分自身を呼び出す処理のこと 処理方法の話なので当然VBAだけ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p><a rel="noreferrer noopener follow" target="_blank" href="https://javeo.jp/vba-file-list-maker/">別のページ</a>で再帰処理を使ったプログラムを作ったわけですが、昔再帰処理を一生懸命後輩に教えたことを思い出したので個別に解説ページを作ってみました</p>



<p>利用シーンはあまり多くないものの、知っておくと便利な処理なので是非一読を</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">再帰処理とは</a></li><li><a href="#toc2" tabindex="0">サンプルプログラム</a></li><li><a href="#toc3" tabindex="0">再帰処理のイメージ</a></li><li><a href="#toc4" tabindex="0">再帰処理のメリット・デメリット</a><ol><li><a href="#toc5" tabindex="0">メリット</a></li><li><a href="#toc6" tabindex="0">デメリット</a></li></ol></li><li><a href="#toc7" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">再帰処理とは</span></h2>



<p>一言で表すと<strong><span class="marker-under">関数やプロシージャが自分自身を呼び出す処理の</span></strong>こと</p>



<p>処理方法の話なので当然VBAだけでなく他のプログラム言語でも使われる処理ですが、私が一番しっくりきたパソコンのフォルダ潜りながらフォルダ情報を収集するプログラムを例に解説します</p>



<h2 class="wp-block-heading"><span id="toc2">サンプルプログラム</span></h2>



<p>メチャメチャシンプルなサンプルプログラムです</p>



<p>何をやっているかと言うとファイルが保存されているフォルダを起点にサブフォルダを照会して、今度はそのフォルダを起点にしてサブフォルダを照会して・・・を繰り返します</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-file="RecursionProcessing" data-lang="Visual Basic + VBA"><code>Sub AddFolderList()
&#39;------------------------------
&#39; メインプロシージャ
&#39;------------------------------
Dim objFso As New Scripting.FileSystemObject

Debug.Print &quot;RootFolder：&quot; & ThisWorkbook.Path
Call SearchFolder(objFso.GetFolder(ThisWorkbook.Path), 1)
End Sub
&#39;------------------------------------------------------------------------------------------
Function SearchFolder(TargetFolder As Scripting.Folder, FolderLv As Long)
&#39;------------------------------
&#39; 再帰処理用プロシージャ
&#39;------------------------------
Dim objFld As Scripting.Folder

Call GetFolderInfo(TargetFolder, FolderLv)
For Each objFld In TargetFolder.SubFolders
    Call SearchFolder(objFld, FolderLv + 1)
Next
End Function
&#39;------------------------------------------------------------------------------------------
Function GetFolderInfo(TargetFolder As Scripting.Folder, FolderLv As Long)
&#39;------------------------------
&#39; フォルダ情報をイミディエイトに表示
&#39;------------------------------
Debug.Print String(FolderLv, &quot;　&quot;) & &quot;FolderName：&quot; & TargetFolder.Name
Debug.Print String(FolderLv + 2, &quot;　&quot;) & &quot;├FileCount：&quot; & TargetFolder.Files.Count
Debug.Print String(FolderLv + 2, &quot;　&quot;) & &quot;├TotalSize：&quot; & TargetFolder.Files.Count
Debug.Print String(FolderLv + 2, &quot;　&quot;) & &quot;├CreateDate：&quot; & TargetFolder.DateCreated
Debug.Print String(FolderLv + 2, &quot;　&quot;) & &quot;└UpdateDate：&quot; & TargetFolder.DateLastModified
End Function</code></pre></div>



<h2 class="wp-block-heading"><span id="toc3">再帰処理のイメージ</span></h2>



<div class="wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top"><figure class="wp-block-media-text__media"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2024/07/2024-07-14_01h12_52.png"><img fetchpriority="high" decoding="async" width="727" height="900" src="https://javeo.jp/wp-content/uploads/2024/07/2024-07-14_01h12_52.png" alt="" class="wp-image-2485 size-full" srcset="https://javeo.jp/wp-content/uploads/2024/07/2024-07-14_01h12_52.png 727w, https://javeo.jp/wp-content/uploads/2024/07/2024-07-14_01h12_52-242x300.png 242w, https://javeo.jp/wp-content/uploads/2024/07/2024-07-14_01h12_52-121x150.png 121w" sizes="(max-width: 727px) 100vw, 727px" /></a></figure><div class="wp-block-media-text__content">
<p>まず再帰処理を使わずに再現しようとした時のプログラムがこちら</p>



<p>フォルダ1-Aを起点とするとその中にフォルダ2-A/2-Bがある、2-Aの中にフォルダ3-Aがあってさらにその中にフォルダ4-A/4-B/4-Cがある</p>



<p>事前に構造がわかっていれば↓の別サンプルのようにFor Nextを必要回数入れ子にして対応することもできますが例えば4-Aの中に新しいフォルダが作成された時、階層がもう一段階深くなるので入れ子が足りず取得できません</p>



<p>無理矢理運用するなら10回くらい入れ子にしておけば大体大丈夫ですがそれではイマイチ</p>
</div></div>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Function SearchFolder(main As Scripting.Folder)
&#39;------------------------------
&#39; 再帰処理しない時のプログラム例
&#39;------------------------------
Dim sub1 As Scripting.Folder, sub2 As Scripting.Folder, sub3 As Scripting.Folder

Call GetFolderInfo(main, 1)
For Each sub1 In TargetFolder.SubFolders
    Call SearchFolder(sub1, 2)
    For Each sub2 In sub1.SubFolders
        Call SearchFolder(sub2, 3)
        For Each sub3 In sub2.SubFolders
            Call SearchFolder(sub3, 4)
        Next
    Next
Next
End Function</code></pre></div>



<div class="wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top"><figure class="wp-block-media-text__media"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2024/07/2024-07-15_01h13_40.png"><img decoding="async" width="432" height="566" src="https://javeo.jp/wp-content/uploads/2024/07/2024-07-15_01h13_40.png" alt="" class="wp-image-2492 size-full" srcset="https://javeo.jp/wp-content/uploads/2024/07/2024-07-15_01h13_40.png 432w, https://javeo.jp/wp-content/uploads/2024/07/2024-07-15_01h13_40-229x300.png 229w, https://javeo.jp/wp-content/uploads/2024/07/2024-07-15_01h13_40-114x150.png 114w" sizes="(max-width: 432px) 100vw, 432px" /></a></figure><div class="wp-block-media-text__content">
<p>そしてこちらが再帰処理のイメージ</p>



<p>Mainフォルダに1-Aを代入すると2-A/2-BがSubフォルダとして取得できる</p>



<p>Subフォルダ2-AをMainフォルダに代入すると次は3-AがSubフォルダに、続いて3-AをMainフォルダにすると4-A/4-B/4-CがSubフォルダになる</p>



<p>ポイントはここでさらに下の階層があればループが続くし、なければここで処理が終わるところ</p>



<p>プログラムも短くスッキリした感じになります</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">再帰処理のメリット・デメリット</span></h2>



<p>結局のところ再帰処理って必要な処理なの？メリット・デメリットは？ってことでまとめてみます</p>



<h3 class="wp-block-heading"><span id="toc5">メリット</span></h3>



<p>繰り返すべき回数が可変なプログラムでも対応することができます</p>



<p>今回のフォルダであれば起点から3階層潜ったわけですが当然もっと深い階層がある可能性もありますが<strong><span class="marker-under">サブフォルダがあればループする</span></strong>仕様になるのでプログラムとして最適化できます</p>



<h3 class="wp-block-heading"><span id="toc6">デメリット</span></h3>



<p>再帰処理は処理の途中で別のことに手を付けるようなことなのでループする度メモリを使うことになり、やり過ぎはメモリ不足を招く可能性があります</p>



<p>もう一点はデメリットと言うより注意点になりますが、処理方法については無限ループになってしまいます</p>



<p>例えばこんな処理</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>&#39;==============================
&#39; 無限ループになるプログラム
&#39;==============================
Sub sample()
Dim i As Long

i = 1
Call AdditionFunc(i)
End Sub
&#39;-------------------------------
Function AdditionFunc(i As Long)
Debug.Print i
Call AdditionFunc(i + 1)
End Function</code></pre></div>



<p>加算し続けるだけで終わりのない無限処理になってしまうのでループに条件を付けるもしくはループを抜ける分岐を付けてあげる必要があります</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>&#39;==============================
&#39; 無限ループを回避したプログラム
&#39;==============================
Sub sample()
Dim i As Long

i = 1
Call AdditionFunc(i)
End Sub
&#39;------------------------------
Function AdditionFunc(i As Long)
Debug.Print i
&#39;---10未満の時だけ再帰処理する
If i &lt; 10 Then
    AdditionFunc = AdditionFunc(i + 1)
End If
End Function</code></pre></div>



<h2 class="wp-block-heading"><span id="toc7">あとがき</span></h2>



<p>再帰処理をフォルダ検索を例に解説してみました</p>



<p>わかるようでわからない再帰処理も実例があるとしっくりきませんか？私はきましたw</p>



<p>他の言語でも考え方や書き方は同じなので参考にしてみてください</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/recursion-processing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
