セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

演習問題テーマ:セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する

「、」で区切られたデータがひとつのセルに入っているとき、別表にその区切り文字の出現回数+1回だけデータ転記します。

この教材についての過去の質問・感想

11598 : 小川慶一の回答 (2019-09-27 10:30:38)

受講生 さん:

すいません、ご質問が来ていたのには気がついていたのですが、お返事することをうっかりしていました。
直前の行の右最端にカーソルを置いて改行するとこの場所にカーソルが来ますが...。

ここは、動画に編集入っていそうですね。僕も、手作業ではこのスピードでこの場所にカーソルを持っていくことはできません。
お待たせしたうえにこんなお返事ですみません。


> 小川先生お世話になっております。
> 9:50のNextの上にsakiを挿入する場面で、Nextの上に行を挿入すると同時にTabのようにsakiの入力位置に移動しているのですが、どんな入力をしているのですか?


11595 : 受講生さんのコメント (2019-09-23 03:04:07)

小川先生お世話になっております。
9:50のNextの上にsakiを挿入する場面で、Nextの上に行を挿入すると同時にTabのようにsakiの入力位置に移動しているのですが、どんな入力をしているのですか?


11347 : 小川慶一の回答 (2019-04-12 17:46:14)

ジュリアンさん:

こんにちは。

> For~Nextの構文では、例えば上記の例のgyoのように、
> 特定のセルの値を示すものだと思い込んでおりましたが、

この認識が違います。

「For Next構文は、処理対象のセルを指定するための技術」と、For Next構文を特定の目的と強度に紐づけすぎていると、本質を見失い、抽象度の高い課題に対処できなくなります。

For Next構文は、カウンターの数値を変更しつつ、 For ... Next の間に記述された処理をくり返し実行するものでしかありません。
カウンターたる変数は、 For の直後に指定する。カウンターの最大値は To の直後に記述する。
ただ、それだけです。

その前提でもう一度考えなおしてみてください。
そうすると、

> このkaisuという変数はgyoのような役割ではなく、いわば形式的に置かれていると考えてよろしいのでしょうか?

のような質問はそもそも意味不明だ、と、ご自身で分かるようになるのでは?とも思います。

考えても分からない場合は、さらに質問してもらってもよいですし、もう一度、そういう視点を持ちつつ「エクセルマクロ・VBA基礎編フォローアップ ベーシック」を全問解き直すのもよいかも知れません。

よろしくお願いいたします。


> 【動画3】でSheet1からSheet2へ転記が行われる際に、
> For kaisu = 0 To Worksheets("Sheet1").Range("G" & gyo).Value
> というマクロの一文が登場しましたが、正直なところ戸惑いを覚えました。
> このkaisuという変数は、マクロの実行に伴い
> 0→1→2→3
> と4つの値を示し、その後に4回の転記が行われています。
> For~Nextの構文では、例えば上記の例のgyoのように、
> 特定のセルの値を示すものだと思い込んでおりましたが、
> このkaisuという変数はgyoのような役割ではなく、いわば形式的に置かれていると考えてよろしいのでしょうか?


11346 : マサラさんのコメント (2019-04-12 17:28:41)

【動画3】でSheet1からSheet2へ転記が行われる際に、
For kaisu = 0 To Worksheets("Sheet1").Range("G" & gyo).Value
というマクロの一文が登場しましたが、正直なところ戸惑いを覚えました。
このkaisuという変数は、マクロの実行に伴い
0→1→2→3
と4つの値を示し、その後に4回の転記が行われています。
For~Nextの構文では、例えば上記の例のgyoのように、
特定のセルの値を示すものだと思い込んでおりましたが、
このkaisuという変数はgyoのような役割ではなく、いわば形式的に置かれていると考えてよろしいのでしょうか?


10351 : 小川慶一の回答 (2018-08-09 13:00:48)

morimotoさん:

自分の手元の道具で解決できるはすだ!という意識を持ってとりくんでください。
実務でもそういう姿勢がこれまで以上にご自身を助けてくれますよ☆

> instrで「、」の位置を見つけ次のstart値を変えていく、、、という苦戦したやり方でしました。。。がmidでストレートに文字を探せばシンプルに解決できるのですね。勉強になりました。問題3で「、」の位置を直接求めずいっきにする方法はびっくりしました!。問題2のコードを加工してるだけですね。使う道具はシンプル、あとは
> ほんと応用するだけですね。


10333 : morimotoさんのコメント (2018-08-07 00:11:59)

instrで「、」の位置を見つけ次のstart値を変えていく、、、という苦戦したやり方でしました。。。がmidでストレートに文字を探せばシンプルに解決できるのですね。勉強になりました。問題3で「、」の位置を直接求めずいっきにする方法はびっくりしました!。問題2のコードを加工してるだけですね。使う道具はシンプル、あとは
ほんと応用するだけですね。


9081 : 小川慶一の回答 (2017-10-19 23:20:11)

受講生 さん:

一文字ずつ文字の中身を調べるというのは、案外使います。
発展編2まで行くともっといい方法を学びますが、それまでは重宝するかと思います。

> nagasa = Len(moji)
>
> For n = 1 To nagasa
> If Mid(moji, n, 1) = "、" Then
> kazu = kazu + 1
>
> がポイント!
>  for の新しい使い方を学んだ!


9076 : 受講生さんのコメント (2017-10-19 21:08:25)

nagasa = Len(moji)

For n = 1 To nagasa
If Mid(moji, n, 1) = "、" Then
kazu = kazu + 1

がポイント!
 for の新しい使い方を学んだ!


8574 : 小川慶一の回答 (2017-07-22 13:11:53)

順調そうですね。
ひきつづき、お楽しみください☆

受講生 さん:

> ○動画13:44分付近でfor next 構文でのブレイクポイント(F9)を使ったテスト方法 
> ですがたいへん参考になりました。繰り返し回数毎に変数の中身を確認することがで 
> きるのですね。
>
> ○for カウンター変数 = 最小値 + 最大値
> の書き方で最小値を0とした書き方が勉強になりました。
>  
> ○問題[1]をinstr関数を使い、問題[3]を作成しました。過去に小川先生がコメン
> されているようにmid関数を使った方法の方がわかりやすいと思いました。
> 下記に記載しました。


8571 : 受講生さんのコメント (2017-07-22 09:18:31)

○動画13:44分付近でfor next 構文でのブレイクポイント(F9)を使ったテスト方法 
ですがたいへん参考になりました。繰り返し回数毎に変数の中身を確認することがで 
きるのですね。

○for カウンター変数 = 最小値 + 最大値
の書き方で最小値を0とした書き方が勉強になりました。
 
○問題[1]をinstr関数を使い、問題[3]を作成しました。過去に小川先生がコメン
されているようにmid関数を使った方法の方がわかりやすいと思いました。
下記に記載しました。

Sub lesson02_ikki() 
    Dim moji
    Dim kazu
    Dim n
    Dim nagasa
    
    Dim saki
    saki = 2
    Dim kaisu
    Dim gyo
        
    For gyo = 2 To 7
        kazu = 0
        moji = Worksheets("Sheet1").Range("E" & gyo).Value
        nagasa = Len(moji)
        For kazu = 0 To nagasa
            n = InStr(n + 1, moji, "、")
            If n = 0 Then
                Exit For
            End If
        Next kazu
        
       For kaisu = 0 To kazu
            Worksheets("Sheet2").Range("A" & saki).Value = saki - 1
            Worksheets("Sheet2").Range("B" & saki & ":G" & saki).Value = Worksheets("Sheet1").Range("A" & gyo & ":F" & gyo).Value
            saki = saki + 1
        Next kaisu
    Next gyo
End Sub


6303 : 小川慶一の回答 (2016-04-04 07:10:23)

受講生 さん:

>転記シートの記述位置を示す変数と、元シートの行位置を示す変数を混同していたのです。

変数は、名前を見た瞬間その機能が分かるような名前にしておかないと必ず混同します。


>最初、[1][2]で求めた回数をそのまま使って一つのマクロで書こうと思ったのですが
>すぐに行き詰りました。少し動画を見ると先生も別々のマクロで作っておられたので、その方式で再挑戦。
>(最終的には先生もダイレクトなマクロにされていましたが、いきなりはハードル高いですよね;)
>
>最初、A列の連続文字が1から6までで止まってしまいました。
>動画で確認すると、変数-1の発想もできていたし、見た目ほとんど同じ内容でした。
>(゜-゜)なぜだろう?
>いろいろ調べてみて、変数の使い方が間違っていたと判明しました。
>転記シートの記述位置を示す変数と、元シートの行位置を示す変数を混同していたのです。
>
>やはり転記作業は、変数を正しく使い分けられるかどうかがポイントですね・・・
>形ができても、正しく変数を使えなければ、期待した結果が得られません。
>ちょっと複雑な動きをすると、すぐに変数を混同してしまうので、
>この辺はやはり、慣れなのでしょうか(-ω-;)
>
>しそ巻きカウント辺りを復習してみようと思います。
>

>Sub tenki033008()
>    Dim gyo   '元データの行数
>    Dim tenki '記入シートでの記述行位置
>    Dim kai     '区切り文字の回数
>    Dim kaisu
>    tenki = 2
>    gyo = 2
>    For gyo = 2 To 7
>        kaisu = Worksheets("sheet1").Range("g" & gyo).Value '区切り回数が記述された場所
>        For kai = 0 To kaisu                            '各行の区切り回数だけ繰り返す
>            Worksheets("sheet2").Range("A" & tenki).Value = tenki - 1
>            Worksheets("sheet2").Range("b" & tenki & ":G" & tenki).Value = Worksheets("sheet1").Range("A" & gyo & ":F" & gyo).Value
>            tenki = tenki + 1
>        Next
>    Next
>End Sub
>

>


6290 : 小川慶一の回答 (2016-04-04 06:57:27)

受講生 さん:

配列使えるとまたぜんぜん違うやり方になるんですけどね。
基礎編なんで、手元の道具だけでゴリゴリやる方法をお伝えしています。最初はとにかく腕力が大切。



>最初の[1]のみです。動画を見ずに挑戦しています。
>instrで「、」を検索し、更に2つめの「、」3つめの「、」があるかどうかを調べて、
>その結果によって回数を導く方法を考えました。
>効率の良い方法ではなさそうですが、やってみました。
>

>Sub rensyu033003()     ’「、」が含まれる回数の調査
>    Dim gyo
>    Dim ten         ’1番目の「、」の文字位置
>    Dim ten2          '2番目の「、」の文字位置
>    Dim ten3          '3番目の「、」の文字位置
>    Dim yakuwari        '調査対象の文字列
>    Dim kaisu        '最終的な回答
>    For gyo = 2 To 7
>        yakuwari = Range("E" & gyo).Value        
>         ten = InStr(yakuwari, "、")
>         ten2 = InStr(ten + 1, yakuwari, "、")
>         ten3 = InStr(ten2 + 1, yakuwari, "、")
>        
>        If ten = 0 Then
>            Range("G" & gyo).Value = 0
>        ElseIf ten2 = 0 Then
>            Range("G" & gyo).Value = 1            
>        ElseIf ten2 > 0 And ten3 = 0 Then
>            Range("G" & gyo).Value = 2
>         ElseIf ten3 > 0 Then
>            Range("G" & gyo).Value = 3
>        End If
>        kaisu = Range("g" & gyo).Value
>    Next
>End Sub
>

>by gooska


6224 : 受講生さんのコメント (2016-03-31 13:43:58)

最初、[1][2]で求めた回数をそのまま使って一つのマクロで書こうと思ったのですが
すぐに行き詰りました。少し動画を見ると先生も別々のマクロで作っておられたので、その方式で再挑戦。
(最終的には先生もダイレクトなマクロにされていましたが、いきなりはハードル高いですよね;)

最初、A列の連続文字が1から6までで止まってしまいました。
動画で確認すると、変数-1の発想もできていたし、見た目ほとんど同じ内容でした。
(゜-゜)なぜだろう?
いろいろ調べてみて、変数の使い方が間違っていたと判明しました。
転記シートの記述位置を示す変数と、元シートの行位置を示す変数を混同していたのです。

やはり転記作業は、変数を正しく使い分けられるかどうかがポイントですね・・・
形ができても、正しく変数を使えなければ、期待した結果が得られません。
ちょっと複雑な動きをすると、すぐに変数を混同してしまうので、
この辺はやはり、慣れなのでしょうか(-ω-;)

しそ巻きカウント辺りを復習してみようと思います。

Sub tenki033008()
    Dim gyo   '元データの行数
    Dim tenki '記入シートでの記述行位置
    Dim kai     '区切り文字の回数
    Dim kaisu
    tenki = 2
    gyo = 2
    For gyo = 2 To 7
        kaisu = Worksheets("sheet1").Range("g" & gyo).Value '区切り回数が記述された場所
        For kai = 0 To kaisu                            '各行の区切り回数だけ繰り返す
            Worksheets("sheet2").Range("A" & tenki).Value = tenki - 1
            Worksheets("sheet2").Range("b" & tenki & ":G" & tenki).Value = Worksheets("sheet1").Range("A" & gyo & ":F" & gyo).Value
            tenki = tenki + 1
        Next
    Next
End Sub


6223 : 受講生さんのコメント (2016-03-31 10:09:32)

動画の最初部分、mid関数で1文字ずつ比較するヒントをいただいた時点で止めて
再度自力で取り組んでみました。
変数を沢山使いこなすことが、やはり難しかったです。
時間かかりましたが、[1]と[2]は解けました。
実はForNext関数で繰り返す回数に変数を使えないだろうか?という意識を
以前から持っていたので、今回それに取り組めてよかったです。
※以前、データの最終行をxldownで求めて、それを繰り返す数にあてはめる方法を
質問したことがありましたよね・・・(;´・ω・)
[3]については、まだうまくいきません。うーん(笑)

Sub rensyu03306()   '[1][2]の回答 mid関数で「、」を調べ、数をカウント
    Dim gyo
    Dim yakuwari        '調査する文字列
    Dim n               'yakuwariの文字数
    Dim kai             '「、」の回数をカウント
    Dim chosa           '文字列ごとに行う繰り返し回数
    
     For gyo = 2 To 7   '役割列の行数だけ繰り返す
        kai = 0         'カウント初期化
        yakuwari = Range("E" & gyo).Value
         n = Len(yakuwari)
         For chosa = 1 To n  '「役割」の文字数分だけ繰り返し調査
            If Mid(yakuwari, chosa, 1) = "、" Then   'yakuwariのn番目を「、」と比較
                kai = kai + 1       '「、」が見つかったらカウント
            End If
        Next
    Range("G" & gyo).Value = kai
    Next
End Sub

by gooska


6209 : 受講生さんのコメント (2016-03-30 10:09:57)

最初の[1]のみです。動画を見ずに挑戦しています。
instrで「、」を検索し、更に2つめの「、」3つめの「、」があるかどうかを調べて、
その結果によって回数を導く方法を考えました。
効率の良い方法ではなさそうですが、やってみました。

Sub rensyu033003()     ’「、」が含まれる回数の調査
    Dim gyo
    Dim ten         ’1番目の「、」の文字位置
    Dim ten2          '2番目の「、」の文字位置
    Dim ten3          '3番目の「、」の文字位置
    Dim yakuwari        '調査対象の文字列
    Dim kaisu        '最終的な回答
    For gyo = 2 To 7
        yakuwari = Range("E" & gyo).Value        
         ten = InStr(yakuwari, "、")
         ten2 = InStr(ten + 1, yakuwari, "、")
         ten3 = InStr(ten2 + 1, yakuwari, "、")
        
        If ten = 0 Then
            Range("G" & gyo).Value = 0
        ElseIf ten2 = 0 Then
            Range("G" & gyo).Value = 1            
        ElseIf ten2 > 0 And ten3 = 0 Then
            Range("G" & gyo).Value = 2
         ElseIf ten3 > 0 Then
            Range("G" & gyo).Value = 3
        End If
        kaisu = Range("g" & gyo).Value
    Next
End Sub

by gooska


5617 : 小川慶一の回答 (2016-01-14 21:43:15)

受講生 さん:

もちろんできるとは思います。
Mid関数で一文字づつ取り出して調べるのが楽なだとは思いますが。

>「、」の数を数える際に、動画でInStr関数を使用しかけて途中でやめていましたが、「InStr関数で「、」の位置を調べ、見つかったらカウントアップする」を
>繰り返す方法でも可能であることが分かりました。実際にコードを書き、動作確認しました。
>


5612 : 小川慶一の回答 (2016-01-14 21:32:14)

受講生 さん:

これ基礎編レベルのスキルだけでできたらなかなかのものです。
もっとも、配列使えば簡単ですし、基礎編のスキルだけでなんとかしようてのが間違っている気もしますけどね。

>最初は配列を使う方法を思いつきコードを書いてしまいましたが、動画で「方針」を聞いた後動画を止め、コードを書き直してみました。
>工夫次第で基礎編の知識だけでもできることが分かったのは、発見でした。


5601 : 受講生さんのコメント (2016-01-13 21:48:37)

「、」の数を数える際に、動画でInStr関数を使用しかけて途中でやめていましたが、「InStr関数で「、」の位置を調べ、見つかったらカウントアップする」を
繰り返す方法でも可能であることが分かりました。実際にコードを書き、動作確認しました。


5595 : 受講生さんのコメント (2016-01-12 22:02:06)

最初は配列を使う方法を思いつきコードを書いてしまいましたが、動画で「方針」を聞いた後動画を止め、コードを書き直してみました。
工夫次第で基礎編の知識だけでもできることが分かったのは、発見でした。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する
    【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する 未習得
  2. 【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する
    【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する 未習得
  3. 【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する
    【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する 未習得
  4. 【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す
    【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す 未習得
  5. 【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する
    【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する 未習得
  6. 【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ
    【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ 未習得
  7. 【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング
    【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング 未習得
  8. 【動画8】 転記先シートを生成してデータを流し込む。
    【動画8】 転記先シートを生成してデータを流し込む。 未習得
  9. 【動画9】 転記先ファイルを生成してデータを流し込む。
    【動画9】 転記先ファイルを生成してデータを流し込む。 未習得
  10. 【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。
    【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。 未習得
  11. 【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。
    【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。 未習得
  12. 【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。
    【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。 未習得
  13. 【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合
    【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合 未習得
  14. 【動画14】 データ記入用ファイルを配布する-その1
    【動画14】 データ記入用ファイルを配布する-その1 未習得
  15. 【動画15】 データ記入用ファイルを配布する-その2
    【動画15】 データ記入用ファイルを配布する-その2 未習得
  16. 【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1
    【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1 未習得
  17. 【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2
    【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2 未習得
  18. 【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1)
    【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1) 未習得
  19. 【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1)
    【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1) 未習得
  20. 【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2)
    【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ