<?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・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/vba%e5%85%b1%e9%80%9a/%e9%96%a2%e6%95%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Sat, 31 Jan 2026 12:27:54 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://officevba.info/wp-content/uploads/2017/04/cropped-Excel_1-32x32.jpg</url>
	<title>関数 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<link>https://officevba.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>文字列関数を用いて長い文字列から特定の部分を抜き出す</title>
		<link>https://officevba.info/mojiretsukansu/</link>
					<comments>https://officevba.info/mojiretsukansu/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 12 Jul 2020 06:41:47 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[Instr]]></category>
		<category><![CDATA[InstrRev]]></category>
		<category><![CDATA[Left]]></category>
		<category><![CDATA[Mid]]></category>
		<category><![CDATA[Right]]></category>
		<category><![CDATA[文字列]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=2154</guid>

					<description><![CDATA[目次 VBAの文字列関数は使いこなすとすごく便利よく使う文字列関数①Left関数②Mid関数③Instr関数④InstrRev関数⑤Len関数文字列関数の使い方の応用例①特定の文字より左側の文字列を抜き出す②特定の文字よ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <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">VBAの文字列関数は使いこなすとすごく便利</a></li><li><a href="#toc2" tabindex="0">よく使う文字列関数</a><ol><li><a href="#toc3" tabindex="0">①Left関数</a></li><li><a href="#toc4" tabindex="0">②Mid関数</a></li><li><a href="#toc5" tabindex="0">③Instr関数</a></li><li><a href="#toc6" tabindex="0">④InstrRev関数</a></li><li><a href="#toc7" tabindex="0">⑤Len関数</a></li></ol></li><li><a href="#toc8" tabindex="0">文字列関数の使い方の応用例</a><ol><li><a href="#toc9" tabindex="0">①特定の文字より左側の文字列を抜き出す</a></li><li><a href="#toc10" tabindex="0">②特定の文字より右側の文字列を抜き出す</a></li><li><a href="#toc11" tabindex="0">③文字列のうち右から数文字だけ除いた分を抜き出す</a></li><li><a href="#toc12" tabindex="0">④文字列の中で特定の文字（列）が複数含まれているか確認する</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">VBAの文字列関数は使いこなすとすごく便利</span></h2>
<p>最近VBAだけでなく、RPAだったり他のプログラミング言語だったりをちょこちょこと使う機会があったのですが、今さらながらVBAの文字列関数の便利さに気づきました。<br />
（他の言語でも似たような関数はあるのに、私が慣れていなくて把握していないだけかもしれませんが）</p>
<p>今回は文字列関数の中で私がよく使うものを紹介します。</p>
<h2><span id="toc2">よく使う文字列関数</span></h2>
<h3><span id="toc3">①Left関数</span></h3>
<p>Left関数は左から決められた文字数を抜き出す関数です。<br />
Excelのワークシートでも同じ関数があります。<br />
形式は下記の通りです。</p>
<div class="VBACode">Left(“全体の文字列”,抜き出したい文字数)</div>
<p>抜き出したい文字数が一定ではなく、特定の文字の位置までを抜き出したい場合は③Instr関数④InstrRev関数などと併せて用います。</p>
<p>Right関数という右から文字を抜きだす関数もありまして基本的な使い方はLeft関数と同じですが、使用頻度は明らかにLeft関数の方が高いと思います。</p>
<h3><span id="toc4">②Mid関数</span></h3>
<p>Left関数やRight関数よりも少し複雑で、文字列の中の指定した位置から指定した文字分抜き出す関数です。<br />
下記の形式で記入します。</p>
<div class="VBACode">Mid(“全体の文字列”,文字を抜き出す開始位置,抜き出す文字数)</div>
<p>抜き出す文字数は省略可能です。<br />
Excelのワークシートでも同じ名前の関数がありますが、抜き出す文字数を省略したときの挙動が変わります。</p>
<li>ExcelワークシートのMid関数→抜き出す文字数の指定が必須（指定しないとエラーになる）</li>
<li>VBAのMid関数→文字列の最後まで抜き出す</li>
<h3><span id="toc5">③Instr関数</span></h3>
<p>文字列の中で特定の文字（列）がどの位置にあるか調べる関数です。<br />
下記の形式で記入します。</p>
<div class="VBACode">Instr(“全体の文字列”,“検索文字(列)”)</div>
<p>指定した文字（列）が含まれていない場合値は0になるという特徴を利用して、文字（列）が含まれているかどうかを判定するのにも使用します。</p>
<p>検索したい文字（列）が複数含まれている場合は、一番左側の位置（若い番号）を抜き出します。</p>
<h3><span id="toc6">④InstrRev関数</span></h3>
<p>Instr関数と同じく、文字列の中で特定の文字（列）がどの位置にあるか調べる関数です。<br />
下記の形式で記入します。</p>
<div class="VBACode">InstrRev(“全体の文字列”,“検索文字(列)”)</div>
<p>Instrとの違いは検索したい文字（列）が複数含まれている場合は、一番右側の位置（大きい番号）を抜き出すことです。</p>
<h3><span id="toc7">⑤Len関数</span></h3>
<p>Len関数は文字列の文字数を抜き出す関数です。<br />
上記4つの関数と比較して使う頻度は低いですが、文字列全体の文字数を把握するときに使います。<br />
形式は下記の通りです。</p>
<div class="VBACode">Len(“全体の文字列”)</div>
<p>単独の使用頻度は高くないのですが、他の関数組み合わせて使用するのがほとんどだと思います。</p>
<h2><span id="toc8">文字列関数の使い方の応用例</span></h2>
<p>文字列関数は単独で使用するより、組み合わせて使用することで便利になることが多いです。<br />
よく使われる文字列関数の組み合わせをご紹介します。</p>
<h3><span id="toc9">①特定の文字より左側の文字列を抜き出す</span></h3>
<p>決まった文字数を抜き出すのではなく、決まった文字までの文字列を抜き出すにはLeft関数とInstr関数を使用します。<br />
例えば文字列の中で「_」までの部分を抜き出す場合、下記のように記入します。</p>
<div class="VBACode">Left(”全体の文字列”,Instr(”全体の文字列”,”_”))</div>
<p>Left関数で左側の文字を抜き出すのですが、その際にInstrを使用して取り出したい文字の位置を指定します。</p>
<p>抜き出すときの目印になる文字（列）が複数存在する場合、最も左側の目印で切り分けたい場合はInstr関数、最も右側の目印で切り分けたい場合はInstrRev関数を用います。</p>
<h3><span id="toc10">②特定の文字より右側の文字列を抜き出す</span></h3>
<p>①の使い方と似ていますが、Mid関数とInstr関数の組み合わせで上記の処理が可能になります。<br />
例えば文字列の中で「_」から後の部分を抜き出す場合、下記のように記入します。</p>
<div class="VBACode">Mid(”全体の文字列”,Instr(”全体の文字列”,”_”)+1)</div>
<p>Instr(”全体の文字列”,”_”)で目印となる「_」の位置を求めて、その次の文字位置から抜き出すために+1を行います。</p>
<h3><span id="toc11">③文字列のうち右から数文字だけ除いた分を抜き出す</span></h3>
<p>全体の文字数が色々変わる中で、右から4文字だけ除いた残りの文字列を抜き出すときなどはLeft関数と組み合わせて下記のように記載します。</p>
<div class="VBACode">Left(“全体の文字列”,Len(“全体の文字列”)-4)</div>
<p>左側を抜き出すのでLeft関数を使用しますが、Len関数を用いて抜き出す文字数を調べています。</p>
<h3><span id="toc12">④文字列の中で特定の文字（列）が複数含まれているか確認する</span></h3>
<p>少しイレギュラーな方法ですが、全体の文字列の中に特定の文字（列）が複数含まれているか確認する方法として、Instr関数の結果とInstrRev関数の結果を比較する方法があります。<br />
下記のように条件分岐に使用します。</p>
<div class="VBACode">If Instr(“全体の文字列”,”_”)= InstrRev(“全体の文字列”,”_”) then<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’1つしか含まれない、もしくは1つも含まれない場合の処理</span></span><br />
Else<br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’2つ以上含まれている場合の処理</span></span><br />
End If</div>
<p>値が0になる場合の分岐を追加することで1つも含まれない場合の処理を分けることも可能です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/mojiretsukansu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>文字列を切り離して配列に格納する方法</title>
		<link>https://officevba.info/split-function/</link>
					<comments>https://officevba.info/split-function/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sat, 12 Oct 2019 04:02:44 +0000</pubDate>
				<category><![CDATA[配列]]></category>
		<category><![CDATA[関数]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1850</guid>

					<description><![CDATA[目次 配列→文字列、文字列→配列の変換はどちらも覚えると便利文字列→配列の変換にはSplit関数を用いる 配列→文字列、文字列→配列の変換はどちらも覚えると便利 以前にこちらの記事で配列を区切り文字で区切った文字列に変換 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><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">文字列→配列の変換にはSplit関数を用いる</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">配列→文字列、文字列→配列の変換はどちらも覚えると便利</span></h2>
<p>以前に<a href="https://officevba.info/joinfunction_uboundfunction/" target="_blank">こちらの記事</a>で配列を区切り文字で区切った文字列に変換するJoin関数をご紹介しましたが、逆に文字列を区切って配列に格納する関数の存在を最近知りました。</p>
<p>どちらも使えるとより便利になることに気づいたのでご紹介します。</p>
<h2><span id="toc2">文字列→配列の変換にはSplit関数を用いる</span></h2>
<p>Split関数は文字列を特定の文字で切り離して、切り離した文字列をそれぞれ配列に格納するという関数です。</p>
<p>例えば誰かが作った住所録などで「郵便番号」「住所」「電話番号」が記載されていたとして、それぞれの情報が半角スペースで区切られた文字列になっているような場合、Split関数を使用すれば3つの情報を切り離して別のセルに格納することができます。</p>
<div class="VBACode">Sub Split関数で配列に格納()<br />
<br />
<span class="VBA_Tab1">Dim 住所連絡先 As String</span><br />
<span class="VBA_Tab2">住所連絡先 = &#8220;〒590-0504 大阪府泉南市信達市場 072-000-0000&#8221;</span><br />
<br />
<span class="VBA_Tab1">Dim 住所配列</span><br />
<span class="VBA_Tab2">住所配列 = Split(住所連絡先, &#8221; &#8220;)</span><br />
<span class="VBA_Tab1">MsgBox 住所配列(1)</span><br />
<br />
End Sub</div>
<p>上記のコードを実行すると住所連絡先の文字列から、「郵便番号」「住所」「電話番号」がそれぞれ配列の住所配列(0)、住所配列(1)、住所配列(2)に格納されます。</p>
<p>Excelの区切り位置指定でも似たような作業をすることができますが、例えば上記のように住所の部分だけ取り出す場合などは圧倒的にSplit関数を使う方が早いと思います。</p>
<p>また、Split関数を使用する際の注意点ですが、格納するための配列はVariant型の変数で宣言する必要があります。<br />
文字列型の配列などで宣言しても使えませんのでご注意ください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/split-function/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>時間を比較するときに使うVBAの関数について</title>
		<link>https://officevba.info/timevalue-timeserial/</link>
					<comments>https://officevba.info/timevalue-timeserial/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 13 Jan 2019 12:46:13 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1707</guid>

					<description><![CDATA[目次 時間の比較の手順を考えてみました時間の比較で使用するVBA関数①TimeValue関数②TimeSerial関数その他使用すると便利な関数 時間の比較の手順を考えてみました 以前にこちらで乗り換え検索を自動で行うツ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">時間の比較の手順を考えてみました</a></li><li><a href="#toc2" tabindex="0">時間の比較で使用するVBA関数</a><ol><li><a href="#toc3" tabindex="0">①TimeValue関数</a></li><li><a href="#toc4" tabindex="0">②TimeSerial関数</a></li></ol></li><li><a href="#toc5" tabindex="0">その他使用すると便利な関数</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">時間の比較の手順を考えてみました</span></h2>
<p>以前に<a href="https://officevba.info/moyoriekikennsaku/" target="_blank">こちら</a>で乗り換え検索を自動で行うツールをご紹介しましたが、追加で所要時間を比較する必要があり、コードを考えました。<br />
文字列で書かれている時間を比較するには関数を用いて変換をしたり、少しコツが必要になりますので、ここで紹介します。</p>
<h2><span id="toc2">時間の比較で使用するVBA関数</span></h2>
<p>時間の比較で使用する関数は主に下記の2つです。</p>
<h3><span id="toc3">①TimeValue関数</span></h3>
<p>文字列で表示されている時間を数値に変換する関数です。<br />
24時間を1とした場合の値に変換されます。</p>
<p>記入方法は下記の通りです。</p>
<li>1.Cells(1, 1) = TimeValue(&#8220;9:00&#8221;)</li>
<li>2.Cells(1, 1) = TimeValue(&#8220;9時00分&#8221;)</li>
<h3><span id="toc4">②TimeSerial関数</span></h3>
<p>こちらも時間を数字で表示するための関数です。<br />
数字で表したい時間の時間（hour）、分(minute)、秒(second)を引数に入力して用います。</p>
<li>Cells(1, 1) = TimeSerial(9, 0, 0)</li>
<h2><span id="toc5">その他使用すると便利な関数</span></h2>
<p>所要時間を表示する際は「〇〇時××分△△秒」ではなく、「〇〇時<span class="red">間</span>××分△△秒」と表示されていることが多いと思います。<br />
この中に入っている「間」が厄介で、このままではTimeValue関数が使用できません。</p>
<p>この「間」を取り除くのにはVBA関数のReplace関数を用います。<br />
（ワークシート関数のReplaceとは挙動が異なります。）</p>
<p>例えばA1セルに「6時間00分」と入力されているとすると、<br />
Cells(1,2) = Replace(A1,”間”,””)と入力するとB1セルに時間に変換した値（=0.25、＝6:00:00など）が入力されます。</p>
<p>ワークシートの書式を設定していなければ自動で時間型に変換されるのでそのまま使用できますし、ワークシートの書式を文字列にしておいてからTimeValue関数で数値型に変換しても良いと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/timevalue-timeserial/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>翌月の日付や前月の日付を算出するユーザー定義関数</title>
		<link>https://officevba.info/characteristicdatefunction/</link>
					<comments>https://officevba.info/characteristicdatefunction/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Tue, 12 Jun 2018 10:00:24 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1447</guid>

					<description><![CDATA[目次 追記：2019/09/20月の日数は一律でないので計算しにくい当月の初日を算出するユーザー定義関数翌月の初日を算出するユーザー定義関数前月の初日を算出するユーザー定義関数 追記：2019/09/20 この記事の内容 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">追記：2019/09/20</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></li><li><a href="#toc5" tabindex="0">前月の初日を算出するユーザー定義関数</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">追記：2019/09/20</span></h2>
<p>この記事の内容は以前に作成したもので、より適切な方法を<a href="https://officevba.info/eomonth/" target="_blank">こちら</a>のページに記載しています。<br />
Excel標準のワークシート関数で月の最終日を取得できる便利な関数があるのでよければご覧ください。</p>
<h2><span id="toc2">月の日数は一律でないので計算しにくい</span></h2>
<p>日付の足し算・引き算などはExcelの中でかなり頻繁に使われる機能だと思いますが、日数が月によってバラバラなために計算が複雑になることが多いと思います。</p>
<p>特にスケジュール帳の作成や共有のシフト表など間違えてはいけない書類・データを作る際、時間をかけて手作業で行っている方も多いと思います。</p>
<p>今回はExcelなどでスケジュール表や共有シフト表を作成する際に役立つ「翌月の初日を」ユーザー定義関数を紹介します。</p>
<h2><span id="toc3">当月の初日を算出するユーザー定義関数</span></h2>
<p>当月の初日を算出するにはYear関数とMonth関数を使用し、下記のように設定します。</p>
<div class="VBACode">Function 当月初日(該当日 As Date) As Date<br />
<br />
<span class="VBA_Tab1">当月初日 = Year(該当日) &#038; &#8220;/&#8221; &#038; Month(該当日) &#038; &#8220;/&#8221; &#038; 1 <span class="VBA_Comment">’①</span></span><br />
<br />
End Function</div>
<h2><span id="toc4">翌月の初日を算出するユーザー定義関数</span></h2>
<p>どんな日付からでも翌月の初日をすぐに算出できる関数があれば、日付の計算における複雑さは改善できると思われますので、今回私は翌月の初日を算出する関数を考えました。</p>
<p>作成の手順は色々パターンがありますが、今回私が考えた関数は下記の手順で翌月の初日を算出する仕様となっています。</p>
<li>①今月（任意の指定した日の当月）1日を算出する。（当月の初日を算出するユーザー定義関数から算出）</li>
<li>②①で算出した当月1日に31日を加算する。（翌月任意日）</li>
<li>③②の年月の初日（1日）を算出する（翌月初日）</li>
<div class="VBACode">Function 翌月初日(該当日 As Date) As Date<br />
<br />
<span class="VBA_Tab1">Dim 翌月任意日 As Date</span><br />
<br />
<span class="VBA_Tab1">翌月任意日 = 当月初日(該当日) + 31 <span class="VBA_Comment">’②</span></span><br />
<span class="VBA_Tab1">翌月初日 = Year(翌月任意日) &#038; &#8220;/&#8221; &#038; Month(翌月任意日) &#038; &#8220;/&#8221; &#038; 1 <span class="VBA_Comment">’③</span></span><br />
<br />
End Function</div>
<h2><span id="toc5">前月の初日を算出するユーザー定義関数</span></h2>
<p>翌月の初日を算出するユーザー定義関数と同様の方法ですが、当月の初日を算出し、そこから1を引いた値で前月を導き出しています。（④）</p>
<div class="VBACode">Function 前月初日(該当日 As Date) As Date<br />
<br />
<span class="VBA_Tab1">Dim 前月任意日 As Date</span><br />
<br />
<span class="VBA_Tab1">前月任意日 = 当月初日(該当日) &#8211; 1 <span class="VBA_Comment">’④</span></span><br />
<span class="VBA_Tab1">前月初日 = Year(前月任意日) &#038; &#8220;/&#8221; &#038; Month(前月任意日) &#038; &#8220;/&#8221; &#038; 1 <span class="VBA_Comment">’⑤</span></span><br />
<br />
End Function</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/characteristicdatefunction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>配列の要素を取り出す関数について</title>
		<link>https://officevba.info/joinfunction_uboundfunction/</link>
					<comments>https://officevba.info/joinfunction_uboundfunction/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Wed, 18 Apr 2018 14:43:43 +0000</pubDate>
				<category><![CDATA[配列]]></category>
		<category><![CDATA[関数]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1365</guid>

					<description><![CDATA[目次 配列の要素を取り出す専用の関数がある関数を使わず配列の要素を取り出すサンプルコードUBound関数を使用した場合のサンプルコードJoin関数を使用した場合のサンプルコード 配列の要素を取り出す専用の関数がある 以前 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</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">UBound関数を使用した場合のサンプルコード</a></li><li><a href="#toc4" tabindex="0">Join関数を使用した場合のサンプルコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">配列の要素を取り出す専用の関数がある</span></h2>
<p>以前から配列の値を取り出すのに良い方法が思いつかなかったので、結構力技で実施していたのですが、配列を取り出すのに便利な関数があることを知ってショックを受けました。</p>
<p>今回は配列の要素を取り出す際に役立つJoin関数とUBound関数をご紹介します。</p>
<h2><span id="toc2">関数を使わず配列の要素を取り出すサンプルコード</span></h2>
<p>これまで私が配列を取り出す際に使用していたコードは以下のようなものになります。</p>
<p>ExcelでA列のセルの値を配列に格納し、その配列の要素を取り出すサンプルコードです。<br />
配列の要素数は可変を想定してコードを作成しています。</p>
<div class="VBACode">Sub 配列の要素取り出し()<br />
<br />
<span class="VBA_Tab1">Dim hairetsu()</span><br />
<span class="VBA_Tab1">Dim i As Long, k As Long</span><br />
<span class="VBA_Tab1">k = 0</span><br />
<span class="VBA_Tab1">i = 0</span><br />
<span class="VBA_Tab1">Do Until Cells(i + 1, 1) = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">ReDim Preserve hairetsu(i)</span><br />
<span class="VBA_Tab2">hairetsu(i) = Cells(i + 1, 1)</span><br />
<span class="VBA_Tab2">k = k + 1</span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Dim mojiretsu</span><br />
<span class="VBA_Tab1">mojiretsu = hairetsu(0)</span><br />
<span class="VBA_Tab1">For i = 1 To k &#8211; 1</span><br />
<span class="VBA_Tab2">mojiretsu = mojiretsu &#038; &#8220;,&#8221; &#038; hairetsu(i)</span><br />
<span class="VBA_Tab1">Next i</span><br />
<span class="VBA_Tab1">MsgBox mojiretsu</span><br />
<br />
End Sub</div>
<p>要素数を調べるために変数kを宣言し、iと同じ数になるようにして呼び出す際に使用しています。</p>
<p>このコードはきちんと動作するのですが、以下2点の手間・問題点がありました。</p>
<li>①要素数で繰り返し処理をする際、変数kに最後に余分に追加された1を減らすのがややこしくて面倒</li>
<li>②変数を文字列にする際に間に入れる文字（今回は”,”）は要素数-1の数を繰り返して挿入するため、配列の1つめかもしくは最終だけは繰り返しの中で処理できない</li>
<p>これらの問題点はUBound関数やJoin関数を使えばきちんと解決できます。</p>
<h2><span id="toc3">UBound関数を使用した場合のサンプルコード</span></h2>
<p>Ubound関数は配列の要素数を返す関数です。<br />
（配列のインデックス番号を返すので厳密には要素数-1となります。）</p>
<p>この関数を知って、これまで私が要素数の確認のためにわざわざ宣言して使用していた変数kが必要ないことがわかりました。<br />
Ubound関数を使用すると要素を文字列にするのが少し簡略化されます。</p>
<div class="VBACode">Sub 配列の要素取り出しUBound関数使用()<br />
<br />
<span class="VBA_Tab1">Dim hairetsu()</span><br />
<span class="VBA_Tab1">Dim i As Long</span><br />
<span class="VBA_Tab1">i = 0</span><br />
<span class="VBA_Tab1">Do Until Cells(i + 1, 1) = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">ReDim Preserve hairetsu(i)</span><br />
<span class="VBA_Tab2">hairetsu(i) = Cells(i + 1, 1)</span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Dim mojiretsu</span><br />
<span class="VBA_Tab1">mojiretsu = hairetsu(0)</span><br />
<span class="VBA_Tab1">For i = 1 To UBound(hairetsu)</span><br />
<span class="VBA_Tab2">mojiretsu = mojiretsu &#038; &#8220;,&#8221; &#038; hairetsu(i)</span><br />
<span class="VBA_Tab1">Next i</span><br />
<span class="VBA_Tab1">MsgBox mojiretsu</span><br />
<br />
End Sub</div>
<h2><span id="toc4">Join関数を使用した場合のサンプルコード</span></h2>
<p>Join関数は配列の要素を文字列の一覧として取り出す関数です。<br />
Join(“配列名”,”区切りに使用する文字列”)の形式で要素を文字列に変換して並べることが可能です。</p>
<p>区切りの文字を”<br />”やVbCr、VbCrLfにすることで改行コードを間にはさむことも可能です。</p>
<p>細かい部分の融通は利きにくいかもしれませんが、簡単に間に文字列を挟み込むことができるので使用しやすいです。</p>
<div class="VBACode">Sub 配列の要素取り出しJoin関数使用()<br />
<br />
<span class="VBA_Tab1">Dim hairetsu()</span><br />
<span class="VBA_Tab1">Dim i As Long, k As Long</span><br />
<span class="VBA_Tab1">i = 0</span><br />
<span class="VBA_Tab1">Do Until Cells(i + 1, 1) = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">ReDim Preserve hairetsu(i)</span><br />
<span class="VBA_Tab2">hairetsu(i) = Cells(i + 1, 1)</span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
<br />
<span class="VBA_Tab1">Dim mojiretsu</span><br />
<span class="VBA_Tab1">mojiretsu = Join(hairetsu, &#8220;,&#8221;)</span><br />
<span class="VBA_Tab1">MsgBox mojiretsu</span><br />
<br />
End Sub</div>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/joinfunction_uboundfunction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBAでのReplace関数の使い方について</title>
		<link>https://officevba.info/replacefunction/</link>
					<comments>https://officevba.info/replacefunction/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 07 May 2017 14:12:31 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1013</guid>

					<description><![CDATA[目次 内容を置き換えるPeplace関数VBAでのReplace関数の使い方私が作成したVBAコードExcelのワークシート上で使用するREPLACE関数とは異なる 内容を置き換えるPeplace関数 あるセルと他のセル [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">内容を置き換えるPeplace関数</a></li><li><a href="#toc2" tabindex="0">VBAでのReplace関数の使い方</a></li><li><a href="#toc3" tabindex="0">私が作成したVBAコード</a></li><li><a href="#toc4" tabindex="0">Excelのワークシート上で使用するREPLACE関数とは異なる</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">内容を置き換えるPeplace関数</span></h2>
<p>あるセルと他のセルの内容を比較しようとしたときに、セルの内容が微妙に違うせいで比較できないことがあります。</p>
<p>私はこの前、二つの表に書いてある店舗一覧を住所の情報を用いてVlookup関数で一つの表になるように加工していたのですが、住所の書き方が微妙に違っていて、情報を抜き出すのに苦労しました。</p>
<p>住所のハイフンが色々使われていて、データが一致している情報が探せなかったのが原因です。<br />
同じ住所でもデータを作成した人によって色々な書き方があります。</p>
<li>「○○市××8-1-1」</li>
<li>「○○市××8 &#8211; 1 &#8211; 1」</li>
<li>「○○市××8―1―1」</li>
<li>「○○市××8－1－1」</li>
<li>「○○市××8ー1ー1」</li>
<li>「○○市××8丁目1番地1」</li>
<p>空白が入っていたり、半角だったり、全角だったり、ひかれているハイフンがハイフンでなく横線だったりすると、それだけでVlookupでは探せなくなります。またハイフンではなく、「丁目」「番地」と記載されている場合もあります。</p>
<p>色々な形式で記載されている住所を、一括である決まった形式に置き換えるときに便利な関数がReplace関数です。</p>
<p>今回はVBAでのReplace関数の使い方について紹介します。</p>
<h2><span id="toc2">VBAでのReplace関数の使い方</span></h2>
<p>VBAでのReplace関数の基本的な使い方は以下のようになります。</p>
<div class="VBACode">Replace(元の文字列, 検索する文字列, 置き換える文字列) </div>
<p>例としてA1セルの文字列のうち&#8221;―&#8221;を&#8221;-&#8220;に変更するには以下のように記載します。</p>
<div class="VBACode">Cells(1, 1) = Replace(Cells(1, 1), &#8220;―&#8221;, &#8220;-&#8220;)</div>
<h2><span id="toc3">私が作成したVBAコード</span></h2>
<p>Replace関数をもとにして私が住所一覧表を修正するのに作ったVBAコードは以下のようになります。</p>
<div class="VBACode">Sub 住所修正()<br />
<span class="VBA_Tab1">Dim i As Long</span><br />
<span class="VBA_Tab1">i = 2</span><br />
<span class="VBA_Tab1">Do Until Cells(i, 1) = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8220;―&#8221;, &#8220;-&#8220;) <span class="VBA_Comment">’全角「―」を半角「-」に変換する</span></span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8220;－&#8221;, &#8220;-&#8220;) <span class="VBA_Comment">’全角のマイナス「－」を「-」に変換する</span></span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8220;ー&#8221;, &#8220;-&#8220;) <span class="VBA_Comment">’「ー」を「-」に変換する</span></span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8220;丁目&#8221;, &#8220;-&#8220;) <span class="VBA_Comment">’「丁目」を「-」に変換する</span></span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8220;番地&#8221;, &#8220;-&#8220;)  <span class="VBA_Comment">’「番地」を「-」に変換する</span></span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8221; &#8220;, &#8220;&#8221;) <span class="VBA_Comment">’半角の空白を削除する</span></span><br />
<span class="VBA_Tab2">Cells(i, 1) = Replace(Cells(i, 1), &#8220;　&#8221;, &#8220;&#8221;) <span class="VBA_Comment">’全角の空白を削除する</span></span><br />
<span class="VBA_Tab1">i = i + 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
End Sub</div>
<p>これで同じ書式で表されるようになり住所の突合せでの確認ができるようになりました。<br />
他に数字やアルファベットの半角、全角を変更する関数が必要な場合もあります。</p>
<h2><span id="toc4">Excelのワークシート上で使用するREPLACE関数とは異なる</span></h2>
<p>Excelのワークシート上で使用するワークシート関数でもREPLACE関数はありますが、VBAで使用するReplace関数とは引数の設定が異なります。<br />
Excelのワークシート関数の中のREPLACE関数は以下のように引数を設定します。</p>
<div class="VBACode">REPLACE(文字列, 開始位置, 文字数, 置換文字列) </div>
<p>VBAの関数とは異なり、開始位置と文字数を設定して置換する方法になります。よって今回のような文字数がばらばらの住所一覧からハイフンの形をそろえたりはできず、少し使い勝手が悪い気がします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/replacefunction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ユーザー定義関数を作成する</title>
		<link>https://officevba.info/function/</link>
					<comments>https://officevba.info/function/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 30 Apr 2017 12:35:09 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1010</guid>

					<description><![CDATA[目次 VBAの機能で関数を作成できるユーザー定義関数の作り方ユーザー定義関数の使用方法 VBAの機能で関数を作成できる VBAを使ってVBAの中や、Excelのシートの中で使える関数を作成することができます。 あらかじめ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAの機能で関数を作成できる</a></li><li><a href="#toc2" tabindex="0">ユーザー定義関数の作り方</a><ol><li><a href="#toc3" tabindex="0">ユーザー定義関数の使用方法</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">VBAの機能で関数を作成できる</span></h2>
<p>VBAを使ってVBAの中や、Excelのシートの中で使える関数を作成することができます。</p>
<p>あらかじめ関数を作っておくと複雑な処理も簡単なコードで実行できるようになります。<br />
今回はあらかじめ作っておくことで便利になるユーザー定義関数についてお伝えします。</p>
<h2><span id="toc2">ユーザー定義関数の作り方</span></h2>
<p>ユーザー定義関数は標準モジュール内にFunctionプロシージャとして作成することで使用できるようになります。</p>
<p>FunctionとSubの違いは返り値があるかどうかの違いです。（詳細をわかっていなくても使用できるのでややこしければ気にせずに作成してみましょう。）<br />
Functionプロシージャの形式はおおよそこのような形になります。</p>
<div class="VBACode">Function 関数名(a As Variant)<br />
<span class="VBA_Tab1">～</span><br />
<span class="VBA_Tab1">～</span><br />
<span class="VBA_Tab1">関数名 = ～～</span><br />
End Function</div>
<p>まずFunction ～で関数名を決めます。<br />
その後必要な処理を記入して、最後に使いたい関数がこういう結果を表すようにしてくださいと記載することで関数を使用できるようになります。</p>
<h3><span id="toc3">ユーザー定義関数の使用方法</span></h3>
<p>私が今まであまりたくさんユーザー定義関数を考えたわけではありませんが、仕事の都合上、氏名か姓のどちらかが表示されているセルから姓だけを抽出したいことがあり、ユーザー定義関数を作ったことがあります。<br />
（姓と名の間は半角の空白が入っているとします。）</p>
<p>その際は以下のVBAコードで関数を定めました。</p>
<div class="VBACode">Function myouji(a As Variant)<br />
<span class="VBA_Tab1">If InStr(a, &#8221; &#8220;) <> 0 Then</span><br />
<span class="VBA_Tab2">myouji = Left(a, InStr(a, &#8221; &#8220;) &#8211; 1)</span><br />
<span class="VBA_Tab1">Else</span><br />
<span class="VBA_Tab2">myouji = a</span><br />
<span class="VBA_Tab1">End If</span><br />
End Function</div>
<p>VBAの条件分岐を関数に使用できるのが大きな特徴です。<br />
空白があれば空白の前の文字を取り出し、空白がなければ全体を表示する関数です。</p>
<p>VBAのコードの中でも使用できますし、他のワークシート関数と同じようにシートの中でも使用できます。</p>
<p>以下の画像はA列に人の名前（氏名もしくは姓のみ）、B列には「=myouji(A～)」の関数を入力しています。<br />
ユーザー定義関数をシートでも使用できるようにした例です。</p>
<p><a href="https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数-300x137.jpg" alt="" width="300" height="137" class="alignnone size-medium wp-image-1009" srcset="https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数-300x137.jpg 300w, https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数-768x349.jpg 768w, https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数-700x319.jpg 700w, https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数-320x146.jpg 320w, https://officevba.info/wp-content/uploads/2017/04/ユーザー定義関数.jpg 879w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/function/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
