<?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>VBA</title>
	<atom:link href="https://ojisan2355.com/tag/vba/feed/" rel="self" type="application/rss+xml" />
	<link>https://ojisan2355.com</link>
	<description></description>
	<lastBuildDate>Sat, 18 Dec 2021 06:20:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://ojisan2355.com/wp-content/uploads/2021/05/cropped-939995-2-32x32.png</url>
	<title>VBA</title>
	<link>https://ojisan2355.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://ojisan2355.com/?pushpress=hub'/>
	<item>
		<title>【Excel+VBA】複数のシートを一括追加</title>
		<link>https://ojisan2355.com/excel_vba_tips-2/</link>
					<comments>https://ojisan2355.com/excel_vba_tips-2/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sat, 18 Dec 2021 06:20:37 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[VBA]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1386</guid>

					<description><![CDATA[　ひとつのExcelブックにシートを追加するとき、普通は、 「＋」ボタンでシート追加 右クリックで名前 としますよね？ しかし、たくさんのシートを追加するのはとても手間のかかる作業です。 　そこで、一度にたくさんのシート [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　ひとつのExcelブックにシートを追加するとき、普通は、</p>



<ul class="wp-block-list"><li>「＋」ボタンでシート追加</li><li>右クリックで名前</li></ul>



<p>としますよね？</p>



<p>しかし、たくさんのシートを追加するのはとても手間のかかる作業です。</p>



<p>　そこで、一度にたくさんのシートを追加して、なおかつハイパーリンクを付けてくれるVBAプログラムを作成しました。</p>



<p>　単純な作業は自動化しましょう。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="820" height="259" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44.png" alt="" class="wp-image-1387" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44.png 820w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44-300x95.png 300w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h03_44-768x243.png 768w" sizes="(max-width: 820px) 100vw, 820px" /><figcaption>目次だけのシートから…</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" width="820" height="259" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06.png" alt="" class="wp-image-1388" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06.png 820w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06-300x95.png 300w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-18_15h04_06-768x243.png 768w" sizes="(max-width: 820px) 100vw, 820px" /><figcaption>大量のシート追加とハイパーリンクを付けることができます</figcaption></figure></div>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>Excelブックに複数のシートを一括追加できる。</li></ul>
</div></div>



<h2 class="wp-block-heading" id="完成形">完成形</h2>



<p>　以下が完成形です。簡単にできました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Sub シートの一括追加()
    
    &#39;追加するシートの名前が書かれたリスト
    Set SheetNameList = Sheets(&quot;目次&quot;).Range(&quot;$A$2:$A$5&quot;)
    
    For Each ListRow In SheetNameList
        &#39;追加するシート名
        NewSheetName = ListRow.Value
        
        &#39;右端にシートを追加
        Set NewSheet = Sheets.Add(After:=Sheets(Sheets.Count))
        
        &#39;シート名をセット
        NewSheet.Name = NewSheetName
        
        &#39;追加したシートへのハイパーリンクを「目次」シートに追加
        NewSheet.Hyperlinks.Add Anchor:=ListRow, Address:=&quot;&quot;, SubAddress:=NewSheetName + &quot;!$A$1&quot;, TextToDisplay:=NewSheetName
    Next
    
    &#39;フォーカスを「目次」シートに戻す
    Sheets(&quot;目次&quot;).Select

End Sub</code></pre></div>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/excel_vba_tips-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Excel+VBA】複数ファイルのレコードをマージしてひとつのファイルにする</title>
		<link>https://ojisan2355.com/excel_vba_tips/</link>
					<comments>https://ojisan2355.com/excel_vba_tips/#respond</comments>
		
		<dc:creator><![CDATA[おじさん2355]]></dc:creator>
		<pubDate>Sat, 11 Dec 2021 09:09:13 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[VBA]]></category>
		<guid isPermaLink="false">https://ojisan2355.com/?p=1371</guid>

					<description><![CDATA[　Excelの複数のファイルにレコードを、１つのファイルにマージするためのVBAを作成しました。 「営業担当者ごとの今月の受注データをひとつにまとめて、部全体の受注データを作成する」といった作業を行う場合、ファイルをひと [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Excelの複数のファイルにレコードを、１つのファイルにマージするためのVBAを作成しました。</p>



<p>「営業担当者ごとの今月の受注データをひとつにまとめて、部全体の受注データを作成する」といった作業を行う場合、ファイルをひとつずつ開いてコピペするのは地味に面倒な作業です。<br>仮に「ひとつのファイルを開く⇒コピペする⇒ファイルを閉じる」の一連の作業に１分かかるとして、１０人分だと１０分、１００人分だと１００分もかかる作業です。</p>



<p>　単純な作業は自動化しましょう。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">この記事でできること</span></div><div class="label-box-content block-box-content box-content">
<ul class="wp-block-list"><li>Excelの複数ファイルを自動集計できる。</li></ul>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4"><label class="toc-title" for="toc-checkbox-4">目次</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><ol><li><a href="#toc3" tabindex="0">ヘッダから下のデータをクリア</a></li><li><a href="#toc4" tabindex="0">行数</a></li><li><a href="#toc5" tabindex="0">貼り付け</a></li></ol></li><li><a href="#toc6" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="完成形"><span id="toc1">完成形</span></h2>



<p>　以下が完成形です。詳細はのちほど解説します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Public Const SHEET_FROM = &quot;Sheet1&quot;         &#39; マージするデータが保存されているシート名
Public Const SHEET_TO = &quot;マージ後&quot;         &#39; マージ後のデータを保存するシート名
Public COLUMN_END  As Long                 &#39; 最大カラム数

Public Function MergerFiles()

    Dim File As String

    COLUMN_END = Columns.Count

    &#39; マージする対象のファイルの場所
    FILE_PATH = ThisWorkbook.Path
    FILE_PATH_FROM = FILE_PATH & &quot;\From&quot;

    &#39;　ヘッダから下のデータをクリア
    ThisWorkbook.Sheets(SHEET_TO).Range(Cells(2, 1), Cells(Rows.Count, COLUMN_END)).Clear

    &#39; ファイルがあるだけループ
    File = Dir(FILE_PATH_FROM & &quot;\*.xlsx&quot;)
    Do While File &lt;&gt; &quot;&quot;
        MergeFile Path:=FILE_PATH_FROM & &quot;\&quot; & File
        File = Dir()
    Loop

End Function

Private Function MergeFile(Path As String)

    Dim BookFrom As Workbook

    Set BookFrom = Workbooks.Open(Filename:=Path, ReadOnly:=True, UpdateLinks:=False)
    
    Set SheetFrom = BookFrom.Sheets(SHEET_FROM)
    Set SheetTo = ThisWorkbook.Sheets(SHEET_TO)
    
    &#39; マージ元の行数(ヘッダを含む)
    With SheetFrom
        RowsFrom = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    
    &#39; マージ先の行数(ヘッダを含む)
    With SheetTo
        RowsTo = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    
    &#39; コピー元の範囲(ヘッダの次の行から最後の行まで)
    Set RangeFrom = SheetFrom.Range(SheetFrom.Cells(2, 1), SheetFrom.Cells(RowsFrom, COLUMN_END))
    &#39; コピー先の範囲(最終行の次の行から、コピー元の行数分)
    Set RangeTo = SheetTo.Range(SheetTo.Cells(RowsTo + 1, 1), SheetTo.Cells(RowsTo + RowsFrom - 1, COLUMN_END))
    
    RangeTo.Value = RangeFrom.Value
    
    BookFrom.Close SaveChanges:=False

End Function
</code></pre></div>



<h2 class="wp-block-heading" id="解説"><span id="toc2">解説</span></h2>



<p>　VBAの中で分かりにくそうな箇所を解説します。</p>



<h3 class="wp-block-heading" id="ヘッダから下のデータをクリア"><span id="toc3">ヘッダから下のデータをクリア</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>    &#39;　ヘッダから下のデータをクリア
    ThisWorkbook.Sheets(SHEET_TO).Range(Cells(2, 1), Cells(Rows.Count, COLUMN_END)).Clear</code></pre></div>



<p>　ここでは、マージ後のデータ格納領域のクリアを行っています。</p>



<p>「Range(Cells(2, 1), Cells(Rows.Count, COLUMN_END))」が、クリア対象となる領域です。ヘッダ行の次の行である２行目から、データが格納されている最終行までを指しています。</p>



<p>下図を例にすると、Cells(2,1)はA2のセル、Cells(Rows.Count, COLUMN_END)は、４行目の右端のセルを表しています。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" width="597" height="262" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_17h36_27.png" alt="" class="wp-image-1381" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_17h36_27.png 597w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_17h36_27-300x132.png 300w" sizes="(max-width: 597px) 100vw, 597px" /><figcaption>赤枠の中をクリア</figcaption></figure></div>



<h3 class="wp-block-heading" id="行数"><span id="toc4">行数</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>    &#39; マージ元の行数(ヘッダを含む)
    With SheetFrom
        RowsFrom = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    
    &#39; マージ先の行数(ヘッダを含む)
    With SheetTo
        RowsTo = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With</code></pre></div>



<p>　コピペをするには「コピー元の行数」と「貼り付け先の最初の行の位置」の情報が必要になります。</p>



<p>上記では、A列の一番下のセルから「Ctrl+↑」で最終行に移動する要領で、コピー元・貼り付け先それぞれのヘッダ行を含む行数(最終行の行番号)を取得しています。</p>



<h3 class="wp-block-heading" id="貼り付け"><span id="toc5">貼り付け</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>    &#39; コピー元の範囲(ヘッダの次の行から最後の行まで)
    Set RangeFrom = SheetFrom.Range(SheetFrom.Cells(2, 1), SheetFrom.Cells(RowsFrom, COLUMN_END))
    &#39; コピー先の範囲(最終行の次の行から、コピー元の行数分)
    Set RangeTo = SheetTo.Range(SheetTo.Cells(RowsTo + 1, 1), SheetTo.Cells(RowsTo + RowsFrom - 1, COLUMN_END))
    
    RangeTo.Value = RangeFrom.Value</code></pre></div>



<p>　コピペを一括で行っています。</p>



<p>　For文などで１行ずつコピーして貼り付ける方法もありますが、その方法だと時間がかかりすぎるため、コピーする範囲を一括選択して貼り付けるようにしています。</p>



<p>　下図を例にすると、コピー元の行数が３行であるため、貼り付け先の領域は４～６行目になります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="597" height="262" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h03_33.png" alt="" class="wp-image-1382" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h03_33.png 597w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h03_33-300x132.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="616" height="404" src="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h04_21.png" alt="" class="wp-image-1383" srcset="https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h04_21.png 616w, https://ojisan2355.com/wp-content/uploads/2021/12/2021-12-11_18h04_21-300x197.png 300w" sizes="(max-width: 616px) 100vw, 616px" /></figure>



<h2 class="wp-block-heading" id="まとめ"><span id="toc6">まとめ</span></h2>



<p>　今回紹介した内容は、コピペに最低限必要な部分を記載しました。</p>



<p>必要に応じて、マージボタンを追加したり、コピー元のファイルのオープン・クローズを見せないようにしたり、カスタイマイズしていただければと思います。</p>



<p>参考になればうれしいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ojisan2355.com/excel_vba_tips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
