表を解析して1行のリストを作る、1行のリストを解析して表にする(その1)

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

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

解説

演習問題テーマ:表を解析して1行のリストを作る、1行のリストを解析して表にする(その1)

For Next構文のはじまりに条件をかくパターンと、For Next構文がおわったあとに処理するパターンを学んでください。

複数のセルの情報を1つのセルにまとめてかく際に重複をさける方法として、前回学習した1つ上の行と比べて同じか違うかによって戻り値がかわる仕組みを使います。

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

11397 : 小川慶一の回答 (2019-05-10 07:08:42)

受講生 さん:

Range(...) のカッコ内では、セルの番地を指定します。

Range("F2")
カッコ内は、「F2」ですね。これはOK。

Range("A2")
カッコ内は、「A2」ですね。これはOK。

Range("C2" & ":" & "E2")
カッコ内は、「C2:E2」ですね。これはOK。

Range("A2" & ",")
カッコ内は、「A2,」ですね。これはNG。

以下の順序で復習されることをおすすめします。

[1] 基礎編本編第2章の動画をすべて見直す。
[2] 第1章12、第2章8-第2章12のドリルをすべて解き直す。
[3] 基礎編フォローアップベーシックのすべての問題を解き直す。


> 小川先生、
> お世話になっております。カンマの使い方で1つ確認させてください。
>解説を見る前に自分で解いた時に、カンマを表示する時にコードとして Range("F2").Value = Range("A2" & ",").Value としたのですが、実行時エラー1004となり、動きませんでした。
> Range("F2").Value = Range("A2").Value & ","としたら可動しました。
>別の会の授業の中でのコロンを使用した Range("C2" & ":" & "E2").Value = 8 のコードを参考に上記のようなコードとしたのですが、エラーがでました。
>確認したいのですが、これはどこがエラーの原因なのでしょうか。よろしくお願いいたします。


11396 : 受講生さんのコメント (2019-05-10 05:52:12)

小川先生、
お世話になっております。カンマの使い方で1つ確認させてください。解説を見る前に自分で解いた時に、カンマを表示する時にコードとしてRange("F2").Value = Range("A2" & ",").Value としたのですが、実行時エラー1004となり、動きませんでした。
Range("F2").Value = Range("A2").Value & ","としたら可動しました。別の会の授業の中でのコロンを使用したRange("C2" & ":" & "E2").Value = 8のコードを参考に上記のようなコードとしたのですが、エラーがでました。確認したいのですが、これはどこがエラーの原因なのでしょうか。よろしくお願いいたします。  


11041 : 小川慶一の回答 (2019-01-30 07:51:05)

ゲストさん:

変数は、作った直後は中身は空っぽです。
以下の講座本編の手書きワークでやったとおり。

○基礎講座第1章6 - 手書きする演習
https://online.pc5bai.com/movie/index/25/102

○基礎講座第1章8 - 変数を使ったプログラム、変数を使う意義
https://online.pc5bai.com/movie/index/25/104


ですので、

最初の

gyosha = gyosha & "," & Range("A" & gyo).Value

では、

gyosha という変数に、

gyosha に入っている値(すなわち、最初の段階では、空っぽ)

"'"

Range("A" & gyo).Value の値(すなわち、「岩手化学」)
をくっつけた、

(空っぽ) , 岩手化学 → ",岩手化学"

という文字列が格納されます。


> ちなみに私は下記でやってみました。あまり格好良くないでしょうか。

Sub kaisya()
Dim gyosh
Dim gyo
gyosh = Range("a" & 2).Value
For gyo = 2 To 11
    gyosh = gyosh & "," & Range("a" & gyo).Value
Next
Range("f2").Value = gyosh

End Sub


実行結果は、どうなりましたか。



> 解答のgyosha = gyosha & "," & Range("A" & gyo).Valueの意味がいまいちわかりません。
> 最初のgyoshaの変数を定義するのに、gyosya=gyosya…とそれまでにgyosyaが出てこないのに、どういう意味でしょうか。
> xを宣言するのにx=x+yだとしたら、x-x=y、0=yのようにならないのでしょうか。
> どうも頭硬いようです。
> ちなみに私は下記でやってみました。あまり格好良くないでしょうか。
>
> Sub kaisya()
> Dim gyosh
> Dim gyo
> gyosh = Range("a" & 2).Value
> For gyo = 2 To 11
> gyosh = gyosh & "," & Range("a" & gyo).Value
> Next
> Range("f2").Value = gyosh
>
> End Sub


11036 : ゲストさんのコメント (2019-01-29 21:17:41)

解答のgyosha = gyosha & "," & Range("A" & gyo).Valueの意味がいまいちわかりません。最初のgyoshaの変数を定義するのに、gyosya=gyosya…とそれまでにgyosyaが出てこないのに、どういう意味でしょうか。
xを宣言するのにx=x+yだとしたら、x-x=y、0=yのようにならないのでしょうか。どうも頭硬いようです。
ちなみに私は下記でやってみました。あまり格好良くないでしょうか。

Sub kaisya()
Dim gyosh
Dim gyo
gyosh = Range("a" & 2).Value
For gyo = 2 To 11
gyosh = gyosh & "," & Range("a" & gyo).Value
Next
Range("f2").Value = gyosh

End Sub


10241 : 小川慶一の回答 (2018-07-09 21:13:24)

morimotoさん:

一行のリストを作るときの基本パターンです。
別解はいろいろありますが、どれも似たようなものですね。

>問題はどれも取り組み応えあるのですが使っている知識は基礎編の内容のものなので、驚きです。

特に初期は腕力が大事です。
腕力がしっかりつけば、実は、知識は対して必要ありません。

ひきつづきお楽しみくださいませ☆


> midで2つ目から表示させる発想はでませんでした。どちらかといえばnantoka_betuの解法が思いつきました。このようなケースは実務で出そうなので上下の比較gyo-1, gyoとmidで消すといった手法は吸収しておきたいです。っと問題はどれも取り組み応えあるのですが使っている知識は基礎編の内容のものなので、驚きです。


10236 : morimotoさんのコメント (2018-07-08 23:30:17)

midで2つ目から表示させる発想はでませんでした。どちらかといえばnantoka_betuの解法が思いつきました。このようなケースは実務で出そうなので上下の比較gyo-1, gyoとmidで消すといった手法は吸収しておきたいです。っと問題はどれも取り組み応えあるのですが使っている知識は基礎編の内容のものなので、驚きです。


9352 : 小川慶一の回答 (2018-01-19 13:18:54)

吉川 裕子さん:

マクロは、言語能力の延長で書くものです。
ですので、上達の過程では、声に出してみる、メモ書きをしてみるといったことはとても有効です。するといずれ、今扱っているレベルの課題でも、慣れてくると、そこまでしないでもマクロを淡々と書けるようになりますよ。
また、くり返し同じ課題にチャレンジすることで、そのレベルに早く到達できるようになるでしょう。

ひきつづき、お楽しみください☆


9350 : ガラパゴスタディー吉川の回答 (2018-01-17 15:40:32)

条件分岐については前回の復習ということもあり、理解度が増しました。

頭がこんがらがるときは、「こういうときはこうする」と一旦日本語で
口に出すと整理できました。
ちょっぴり恥ずかしい方法ですが、マクロとにらめっこしても答えは出ないと思うので、こういうことでも繰り返し行うことで、日本語を書くように深く考えなくてもマクロが書けるようになるのではないかなぁと思っています。
引き続き学習いたします。


9043 : 受講生さんのコメント (2017-10-11 22:00:48)

1行にリストアップするポイントは
gyosha = gyosha & ","& Range("A"&gyo).value
のようにすると”A"&gyo の値が","で区切られたリストとなる。


8074 : 小川慶一の回答 (2017-05-04 11:13:27)

柴田 邦彦さん:

よくあるご質問です。
まずは、以下のブログ記事をお読みいただけますでしょうか。
その後、また何かあればご質問ください。
http://www.exvba.com/blog/?p=4378


8070 : 柴田 邦彦さんのコメント (2017-05-03 16:01:32)

基礎コースフォローアップを受講中です。

[受講方法]
1.動画を見る前に、自力で課題(ドリル)にチャレンジしてみる。
2.動画を見る
3.小川先生のロジックと自分のロジックを比較する。
4.再度、小川先生のロジックでマクロを作成する。
時間は要しますが。上記の4ステップで学習しております

[質問]
一般的にマクロに正解はないと言われますが…
自力で作成したマクロがスマートにできてるかどうかは別として、
マクロの結果が同じであるならば、小川先生の解答と同じでなくても気にする必要ないのでしょうか?
それとも、結果が同じであっても、ロジックの考え方を改めるべきでしょうか?

[質問の意図]
与えられた課題ならば、実際に小川先生のロジックでマクロを組む方が、正解だと考えます。
しかしながら、実際に業務でマクロを自力で作成する場合は、細かく結果を見ながら試行錯誤をして作りあげていくことになり、解答があるわけではありません。(誰かに善し悪しを指導してもらえるわけでもない)
よって、必ずしも、スマートで誰が見ても分かりやすいマクロになるとは限りませんし、結果(ゴール)オーライでマクロを作ることになります。


6883 : 小川慶一の回答 (2016-08-02 00:08:06)

受講生 さん:

>1事業者ごとの納期転記が終了したら、nouki =""で消し 次の事業者の納期を転記する・・
>合計するマクロでgoukei=0にする。一旦リセットする・・これと同じ考え方で良いでしょうか。

動画「出現回数を数える。CountIf関数がやっていることをマクロで書くと?」で解説していることと同じです。
https://online.pc5bai.com/movie/index/27/150

この機会に、全動画講座をイチからやり直されるとよいかと思います。


6877 : 受講生さんのコメント (2016-08-01 00:08:20)

小川先生
お世話になります。
nouki=""がないと 事業者の納期がどんどん上書きされました。
1事業者ごとの納期転記が終了したら、nouki =""で消し 次の事業者の納期を転記する・・
合計するマクロでgoukei=0にする。一旦リセットする・・これと同じ考え方で良いでしょうか。

>受講生 さん:
>
>nouki = ""
>
>の一行がない状態のプログラムを作って実行し、結果を検証してください。
>K列に文字列を出力する行かその直前にブレークポイントを入れ、自動データヒント機能も活用しつつテストすると分かるかもしれません。
>
>
>>お世話になります。
> 会社で納期を転記する仕事があり
>「表を解析して1行のリストをつくる」を参考にして納期と枚数も転記するように作成しました。
> あらかじめ事業者リストは作成してあり 納期一覧から納期と枚数を転記します。
> 動画を見ながら確認して先生のcreatelist2を参考にして・・と何とか思った通りに転記できましたが
>データを入れたら中身を消す nouki = "" ・・ここがどうも理解できませんでした。
>一つ前の事業者分を消す?・・とういことでしょうか・・
>kiso18のcreatelist3に作成させて頂きました。
>少し補足を頂けると助かります。
>
>Sub createlist3() '事業名リストが作成済の場合
> Dim hida '事業者リスト I2:K11の範囲
> Dim migi '納期リスト B2:D27の範囲
> Dim nouki '納期と枚数
> For migi = 2 To 11
> For hida = 2 To 27
> If Range("A" & hida).Value = Range("i" & migi).Value Then
> If migi > 2 Then
> Range("k" & migi - 1).Value = Mid(nouki, 2)
> End If
> nouki = ""
> migi = migi + 1
> End If
> nouki = nouki & "," & Range("C" & hida).Value & "-" & Range("d" & hida).Value & "枚"
> Next
> Range("k" & migi - 1).Value = Mid(nouki, 2)
> Next
>End Sub
>
>
>


6873 : 小川慶一の回答 (2016-07-28 07:28:50)

受講生 さん:

nouki = ""

の一行がない状態のプログラムを作って実行し、結果を検証してください。
K列に文字列を出力する行かその直前にブレークポイントを入れ、自動データヒント機能も活用しつつテストすると分かるかもしれません。


>お世話になります。
会社で納期を転記する仕事があり
「表を解析して1行のリストをつくる」を参考にして納期と枚数も転記するように作成しました。
あらかじめ事業者リストは作成してあり 納期一覧から納期と枚数を転記します。
動画を見ながら確認して先生のcreatelist2を参考にして・・と何とか思った通りに転記できましたが
データを入れたら中身を消す nouki = "" ・・ここがどうも理解できませんでした。
一つ前の事業者分を消す?・・とういことでしょうか・・
kiso18のcreatelist3に作成させて頂きました。
少し補足を頂けると助かります。

Sub createlist3() '事業名リストが作成済の場合
Dim hida '事業者リスト I2:K11の範囲
Dim migi '納期リスト B2:D27の範囲
Dim nouki '納期と枚数
For migi = 2 To 11
For hida = 2 To 27
If Range("A" & hida).Value = Range("i" & migi).Value Then
If migi > 2 Then
Range("k" & migi - 1).Value = Mid(nouki, 2)
End If
nouki = ""
migi = migi + 1
End If
nouki = nouki & "," & Range("C" & hida).Value & "-" & Range("d" & hida).Value & "枚"
Next
Range("k" & migi - 1).Value = Mid(nouki, 2)
Next
End Sub



6192 : 小川慶一の回答 (2016-03-29 16:40:53)

受講生 さん:

ループに入った直後、終わった直後は要注意です。
リアルの仕事でもそうですよね。何か起こりがちなのはそういうときです。


>MIDですっきり解決するほうが分かりやすいけれど、やっぱり
>IF構文で最初に分岐処理する方法も覚えたいと思って、
>動画をもう一度みたんです。
>

>For gyo = 2 To 11
>        If gyo = 2 Then     
>        Else
>

>なんとIFの条件分岐には、こういう指定もできるんですね!
>今まで対象セルでの条件で分岐という使い方しか知らなかったので、
>ループの中で「カウントが何回目のときだけは、これをしなさい」
>という使い方。これも目からウロコでした。
>
>このヒントから、gyo=2 then 以下を作ろうと思い
>動画を止めてやってみたんですが、できませんでした(;´・ω・)
>正解に納得。まだまだ理解不十分。
>ForNext構文の最初でも最後でもできるようになりたいです!
>
>後半の重複処理については前回の復習でもあるので、一発正解(^▽^)/
>
>メーリングリストのためのcsvですか!
>なるほど、使い道はいろいろあるのですね。
>by gooska


6159 : 受講生さんのコメント (2016-03-28 11:19:00)

MIDですっきり解決するほうが分かりやすいけれど、やっぱり
IF構文で最初に分岐処理する方法も覚えたいと思って、
動画をもう一度みたんです。

For gyo = 2 To 11
        If gyo = 2 Then     
        Else

なんとIFの条件分岐には、こういう指定もできるんですね!
今まで対象セルでの条件で分岐という使い方しか知らなかったので、
ループの中で「カウントが何回目のときだけは、これをしなさい」
という使い方。これも目からウロコでした。

このヒントから、gyo=2 then 以下を作ろうと思い
動画を止めてやってみたんですが、できませんでした(;´・ω・)
正解に納得。まだまだ理解不十分。
ForNext構文の最初でも最後でもできるようになりたいです!

後半の重複処理については前回の復習でもあるので、一発正解(^▽^)/

メーリングリストのためのcsvですか!
なるほど、使い道はいろいろあるのですね。
by gooska


6156 : 小川慶一の回答 (2016-03-27 20:25:02)

受講生さん:

カンマ区切りの文字列を作るケースは、けっこうありますよ。
メールアドレスのリストを作ってBCCの配信先に放り込むとか、サラリーマン時代に僕はよくやりました。

CSVファイルを作るマクロを書くだけでしたら、適当な表を作ったあと、自動記録しながら保存形式にCSVを選択して保存すればOKです。

>なんと、ここでMIDやLENを使うとは!?まさに目から鱗状態(+_+)
>出だしだけの例外処置として、先頭か末尾を単純操作するわけですね。

>出だしだけ条件分岐したり、最後に文字列の加工などを
>することが発生すると。今後のために、ここは覚えておこうと思いました。

こういう、「ループを抜けたらすぐに最終処理をする」というパターンは実務でよく登場します。

>結論・・・・まだまだです(笑)

いえいえ。吸収早い方なんで、心配していません。楽しい失敗でしたねw


6147 : 海上 美弥子さんのコメント (2016-03-27 15:27:30)

リストからcsv形式のデータを作るマクロですね。
実務ではcsvをAccessやExcelに取り込んだり吐き出したりしていたので
これができるとなれば実務直結ですから興味津々です。
しそ巻きカウントの応用で、数値加算のところを文字列の追加という形で
できるのかなと最初の道筋はつきましたが、まだまだ理解が浅いらしく、動かしてみると
ラストの2文字列しか残っていなくて、形になるまで結構苦労しました。
ようやくできた!と思ったのが、動画で先生が始めに作られた
「ちょっと惜しい形ですね」と同じもの。つまり、先頭がカンマでした(笑)
なんとかしようといろいろ試したのですが、どうしてもダメで(´;ω;`)ウゥゥ
ギブアップして動画を見にきました。

なんと、ここでMIDやLENを使うとは!?まさに目から鱗状態(+_+)
出だしだけの例外処置として、先頭か末尾を単純操作するわけですね。

変数は初期設定されていない限り、値が代入されるまではempty(0)である
ということを確認させてくれる問題でした。
しそ巻きカウントや条件つき加算の場合なら、初期値が0でも結果に影響することは
ないのですが、今回のように文字列をカンマでつなぐ場合は、数値が代入される前にカンマが
入ってしまうので、empty時の変数の存在をいやでも意識させられます。
今まで気がつかなかった大事な点なので、とても勉強になります。

そして、この出だしの変数empty時の動きが最終的に求めたい結果の例外に
なってしまうことがあるから、出だしだけ条件分岐したり、最後に文字列の加工などを
することが発生すると。今後のために、ここは覚えておこうと思いました。
結論・・・・まだまだです(笑)
by gooska


5256 : 小川慶一の回答 (2015-11-11 06:52:09)

関口昭博 さん:

お渡ししたテキスト「Visual Basic Editor初中級操作ガイド」に記載しています。P83-84くらい。
まずはそちらを参照し、それでも不明なところがあれば、また質問いただけますでしょうか。

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

>小川先生お世話になります。
>この動画の5:50のあたりで、Ctrl+Hで置換する場面がありますが、そのあたりの手順を詳しく教えていただけますか。
>少しでも楽する方法を覚えたいものですから。
>よろしくお願いいたします。


5247 : 関口昭博さんのコメント (2015-11-11 05:00:18)

小川先生お世話になります。
この動画の5:50のあたりで、Ctrl+Hで置換する場面がありますが、そのあたりの手順を詳しく教えていただけますか。
少しでも楽する方法を覚えたいものですから。
よろしくお願いいたします。


4801 : 小川慶一の回答 (2015-08-05 05:42:36)

鈴木優子 さん:

次にやるときにはこんな流れでできればよいですね。

>自力で書いたマクロで動いて嬉しかったのですが、
>やっぱり解答のマクロはシンプルでかっこいいですね。
>わたしは、、、毎回書き出してしまいました。。。
>mid 関数は思いつきませんでした。
>

Sub mondai()
>    Dim gyo
>    Dim gyousyamei
>    Dim furigana
>    For gyo = 2 To 11
>        gyousyamei = Range("A" & gyo).Value
>        furigana = Range("B" & gyo).Value
>        If gyo = 2 Then
>            Range("F2").Value = gyousyamei
>            Range("F3").Value = furigana
>        Else
>            Range("F2").Value = Range("F2").Value & "," & gyousyamei
>            Range("F3").Value = Range("F3").Value & "," & furigana
>        End If
>    Next
>End Sub
>


4797 : 鈴木優子さんのコメント (2015-08-04 22:50:18)

自力で書いたマクロで動いて嬉しかったのですが、
やっぱり解答のマクロはシンプルでかっこいいですね。
わたしは、、、毎回書き出してしまいました。。。
mid 関数は思いつきませんでした。

Sub mondai()
    Dim gyo
    Dim gyousyamei
    Dim furigana
    For gyo = 2 To 11
        gyousyamei = Range("A" & gyo).Value
        furigana = Range("B" & gyo).Value
        If gyo = 2 Then
            Range("F2").Value = gyousyamei
            Range("F3").Value = furigana
        Else
            Range("F2").Value = Range("F2").Value & "," & gyousyamei
            Range("F3").Value = Range("F3").Value & "," & furigana
        End If
    Next
End Sub


3894 : 小川慶一の回答 (2015-02-24 09:10:52)

watanbe daichi さん:

基礎編では基本的な道具を組合せてどこまでできるか?てところをしっかりお伝えしています。
ひきつづきよろしくお願いいたします☆

>今回の動画では私のつめ方の甘さが仕事にもついているように感じました。
>最初のカンマを消す方法はいくつかの組み合わせで十分に出来るのですね…。
>ありがとうございます。


3885 : watanbe daichiさんのコメント (2015-02-21 20:17:04)

今回の動画では私のつめ方の甘さが仕事にもついているように感じました。
最初のカンマを消す方法はいくつかの組み合わせで十分に出来るのですね…。
ありがとうございます。


3826 : 小川慶一の回答 (2015-02-13 06:35:58)

匿名 さん:

ループを抜けたあと加工して終わり、というのは典型的なパターンです。


>最初は、どうしても「,(コンマ)」が残ってしまうと思ったので、自力だけでは解答に到達しませんでした(^_^;)
>
>ここで、MId関数を使うことは思い付きませんでした。
> Range("F2").Value = Mid(gyosya, 2)
> Range("F3").Value = Mid(kana, 2)
>
>「マクロを学ぶと言うことは、『視野を広げて考えること』でもあるのだな」
>と実感しました。
>毎回、勉強になります。
>ありがとうございます(^o^)
>


3811 : 受講生さんのコメント (2015-02-11 23:39:41)

最初は、どうしても「,(コンマ)」が残ってしまうと思ったので、自力だけでは解答に到達しませんでした(^_^;)

ここで、MId関数を使うことは思い付きませんでした。
Range("F2").Value = Mid(gyosya, 2)
Range("F3").Value = Mid(kana, 2)

「マクロを学ぶと言うことは、『視野を広げて考えること』でもあるのだな」
と実感しました。
毎回、勉強になります。
ありがとうございます(^o^)


3781 : 小川慶一の回答 (2015-02-09 00:04:53)

ゲスト さん:

自力での回答到達、すばらしいです。

Sub complist1()
    Dim i, all, all2
        all = Range("A" & 2).Value  'インデント減らす
        all2 = Range("B" & 2).Value 'インデント減らす
        
    For i = 3 To 11
        all = all & "," & Range("A" & i).Value
        all2 = all2 & "," & Range("B" & i).Value
    Next
    Range("F2").Value = all
    Range("F3").Value = all2
End Sub



>今回は悩みました^^; でも自分でできたので嬉しいですヽ(*´v`*)ノ
>最後にコンマがくるのはどうしたものかな... と考えてそれを解決したのが以下のコードです。
>
>
>Sub complist1()
>    Dim i, all, all2
>        all = Range("A" & 2).Value
>        all2 = Range("B" & 2).Value
>        
>    For i = 3 To 11
>        all = all & "," & Range("A" & i).Value
>        all2 = all2 & "," & Range("B" & i).Value
>    Next
>    Range("F2").Value = all
>    Range("F3").Value = all2
>End Sub
>

>
>mid関数は思いつきませんでした。


3776 : 佐藤 あゆむさんのコメント (2015-02-08 17:47:40)

[コード]...[/コード] の使い方会得しましたヾ(*≧∀≦*)ノ
スペースを取ってしまって申し訳ありません。


3775 : 佐藤 あゆむさんのコメント (2015-02-08 17:44:48)

 ... 
の使い方を検証中です^^;

今回は悩みました^^; でも自分でできたので嬉しいですヽ(*´v`*)ノ
最後にコンマがくるのはどうしたものかな... と考えてそれを解決したのが以下のコードです。

Sub complist1()
Dim i, all, all2
all = Range("A" & 2).Value
all2 = Range("B" & 2).Value

For i = 3 To 11
all = all & "," & Range("A" & i).Value
all2 = all2 & "," & Range("B" & i).Value
Next
Range("F2").Value = all
Range("F3").Value = all2
End Sub


mid関数は思いつきませんでした。


3774 : 佐藤 あゆむさんのコメント (2015-02-08 17:42:19)

今回は悩みました^^; でも自分でできたので嬉しいですヽ(*´v`*)ノ
最後にコンマがくるのはどうしたものかな... と考えてそれを解決したのが以下のコードです。

code
Sub complist1()
Dim i, all, all2
all = Range("A" & 2).Value
all2 = Range("B" & 2).Value

For i = 3 To 11
all = all & "," & Range("A" & i).Value
all2 = all2 & "," & Range("B" & i).Value
Next
Range("F2").Value = all
Range("F3").Value = all2
End Sub
/code

mid関数は思いつきませんでした。


546 : ガラパゴスタディー事務局の回答 (2013-09-17 00:00:00)

小俣さん:

道具の数より、アイデアですね。


545 : 小俣卓生さんのコメント (2013-09-16 00:00:00)

変数や演算子などの基本的な考え方とFor...Next構文とIf...EndIf構文だけで本当にいろいろなことができることがよくわかりました。

実務的によく出会う場面でとても活かせそうです


544 : ガラパゴスタディー事務局の回答 (2013-05-18 00:00:00)

高橋さん:

お楽しみいただいているようでなにより。

ひととおり終わったら、また最初からやってみてください!
きっと、驚くほど簡単に感じられるようになっているはずです☆


543 : 高橋 圭子さんのコメント (2013-05-15 00:00:00)

次が基礎編最終回ですか!遅れ遅れしながらなんとかここまで来ましたが、まだまだ身についていないので、今後は反復と、実際に使ってみたいと思います。
現時点での自力到達点を公開します。
midにも気が付かず、行数も多くでまだまだですが。

Sub kakidashi2()
    Dim kanji
    Dim furigana
    Dim gyo
    For gyo = 2 To 27
        If Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
        kanji = kanji & "," & Range("A" & gyo).Value
        End If
    Next
    Range("F2").Value = kanji
    For gyo = 2 To 27
        If Range("B" & gyo - 1).Value <> Range("B" & gyo).Value Then
        furigana = furigana & "," & Range("B" & gyo).Value
        End If
    Next
    Range("F3").Value = furigana
End Sub


542 : ガラパゴスタディー事務局の回答 (2013-04-30 00:00:00)

池本さん:

いよいよ、ラストの一歩手前まできましたね (^^

fornext構文の入り際、出る際は、特殊な処理が入るタイミングの多いところです。

あと、変数に値を格納するほうが、セルに値を書き込むよりも高速です。


541 : 池本利恵さんのコメント (2013-04-28 00:00:00)

こんにちは~☆

問題1も2も自力で1回で簡単にできた~!と思って
動画をみたらまんまとひっかかってました^^;

この問題のポイントは、単に情報の書き出し羅列ができるかではなくて、情報と情報の間のカンマをどう処理するかだとよ~く理解しました。

その処理をfor next構文の中で加工してかきだしていくか、
とりあえずfor next構文の中でかきだしした後、加工を加えるか、いずれにしても加工をどうやってfor next構文の中でも外でも加えていくのかの考え方がおさえどころと理解しました。

あとは、私のかいたマクロは変数をfor next構文にしか使っていないので、変数を使っておいた方がif文をまるごとコピペしなくてもいいし、カンマすっきり加工もできるし、全体的にスマートにきまるぞということを再確認しました。

勉強になりました(*^^*)♪
いよいよ次回は最終回~☆ 

私のかいたマクロ。問題1も2も2to11か2to27の違いだけで同じのをかきました。

Sub kakidasi()
    
    Dim gyo
    For gyo = 2 To 11
    If Range("A" & gyo).Value <> Range("A" & gyo - 1).Value Then
        Range("F2").Value = Range("F2").Value + Range("A" & gyo).Value & ","
    End If
    If Range("B" & gyo).Value <> Range("B" & gyo - 1).Value Then
        Range("F3").Value = Range("F3").Value + Range("B" & gyo).Value & ","
    End If
        
   Next
     
End Sub


540 : ガラパゴスタディー事務局の回答 (2013-03-09 00:00:00)

豊島さん:

自力でできたなら、なによりです。なかなか、すごい!

for next の前、ループの初回、ループの最終回、 for next の後は、特殊な処理が入りがちです。
詳しくは、このページのこれまでのやりとりからいろいろ学んでください。

> エクセルシートをソートし直してるからこそ、"<>"を使った条件分岐が使える訳ですよね?

そうそう。
ちなみに、発展編で扱う「伝票作成マクロ」では、まず番号を振って、ソートして、処理して、最初に振った番号でソートして終わり、としています。

この動画は、その前哨戦だったり。


539 : 豊島 久博さんのコメント (2013-03-08 00:01:00)

今回の2番の問題とか、前回の資料1、資料2に番号つけたりする問題は、エクセルシートをソートし直してるからこそ、"<>"を使った条件分岐が使える訳ですよね?


538 : 豊島 久博さんのコメント (2013-03-08 00:00:00)

1番の問題で40分ぐらいかかりましたが、動くマクロを作成できました。2番は前回やったばかりなので、if文で”<>”を付け足すことにすぐに気がついたので10分ぐらいでできました。
だだし、今回ポイントになっていた、for~next構文の最初または、後に、","を省く処理には気付かず、初期値をrange("A2").valueにして、3行目からfor~next構文を使いました(汗)


537 : ガラパゴスタディー事務局の回答 (2013-02-11 00:00:00)

山根さん:

> 出た直後というのは動画解説での

すいません。そうでした。
自分でおもいきり動画解説していました(汗

大変失礼いたしました m(_ _ )m


536 : 山根信行さんのコメント (2013-02-08 00:00:00)

出た直後というのは動画解説での
Sub detatyokugo()
Dim gyo As Long
Dim namae As String
Dim furi As String
For gyo = 2 To 11
namae = namae & "," & Range("A" & gyo).Value
furi = furi & "," & Range("B" & gyo).Value
Next
Range("F2").Value = Mid(namae, 2)
Range("F3").Value = Mid(furi, 2)
End Sub

これではないんですか?それとも
Sub detatyokugo2()
Dim gyo As Long
Dim namae As String
Dim furi As String
For gyo = 2 To 11
namae = namae & "," & Range("A" & gyo).Value
furi = furi & "," & Range("B" & gyo).Value
If gyo = 11 Then
namae = Mid(namae, 2)
furi = Mid(furi, 2)
End If
Next
Range("F2").Value = namae
Range("F3").Value = furi
End Sub

こんなのだったりですか。
なんか的を得てないものかもしれません。


535 : ガラパゴスタディー事務局の回答 (2013-02-06 00:03:00)

山根さん:

ご呈示のマクロ。

if gyo =2 then

else

end if

くらいでもよいです。

あと、以下の件。すいません。あまり網羅的な言い方でなかったことに気がつきました。

[1] 入る直前
[2] 最初の処理の直後
[3] 入った直後

ついては、以下に訂正します。

[1] 入る直前
[2] 最初の処理の直後
[3] 出た直後

「出た直後」でも考えてみてください(汗


534 : 山根信行さんのコメント (2013-02-06 00:02:00)

For Next直後で書いてみました。
実行結果は同じですが、直後という意味合いで合っているでしょうか。

Sub tyokugo()
Dim gyo As Long
Dim namae As String
Dim furi As String
For gyo = 2 To 11
If Left(namae, 1) = "," Then
namae = Mid(namae, 2)
End If
If Left(furi, 1) = "," Then
furi = Mid(furi, 2)
End If
namae = namae & "," & Range("A" & gyo).Value
furi = furi & "," & Range("B" & gyo).Value
Next
Range("F2").Value = namae
Range("F3").Value = furi
End Sub


533 : ガラパゴスタディー事務局の回答 (2013-02-06 00:01:00)

山根さん:

いただいたコードでも、よいと思いますよ。

山根さん宛でもどこかのコメントへのフィードバックで書いたと思いますが、

For Next構文の

[1] 入る直前
[2] 最初の処理の直後
[3] 入った直後

は、いろいろ特殊な処理がありがちなときです。

今回の山根さんのは[1]、動画で解説したのは[2]のやり方です。

ということですので、それではさっそくひきつづき、今度は[3]のやり方で自力トライしてみてください(笑


532 : 山根信行さんのコメント (2013-02-06 00:00:00)

最初、こう書いてしまいました。
Sub Q1()
Dim gyo As Long
Dim namae As String
Dim furi As String
namae = Range("A2").Value
furi = Range("B2").Value
For gyo = 3 To 11
namae = namae & "," & Range("A" & gyo).Value
furi = furi & "," & Range("B" & gyo).Value
Next
Range("F2").Value = namae
Range("F3").Value = furi
End Sub

最後の変数の値をMidで切り出せば良かったんですね。
ForNextの中身をあれこれいじってましたがうまくいきませんでした。
頭の引き出しが固い時と柔らかい時があるように思います。
今日は固めなようです。


531 : ガラパゴスタディー事務局の回答 (2012-12-02 00:01:00)

> 今回自分が分かっていなかったなと思ったのは、変数は何も指定しなければempty値のままであることと、変数にデータをためていける(?)ことでした。

この動画セミナーシリーズ前半で、「しそ巻き無料」の数を数えるお題がありました。

骨格だけ示すと、以下のとおり。

'「kazu」の中身を書き出す。
for xxx
    if 条件 then
        kazu = kazu + 1
    end if
next


ここで、

kazu = kazu + 1

のところ、

moji = moji & "," & 新たに見つけた値

となっただけです。

そういう視点で、コードを再度読み返してみてください。


> どこかのセルに値を書き出すことばかり考えていましたが、

もちろん、以下でもよいですよ。

Range("F2").Value = Range("F2").Value & "," & Range("A" & gyo).Value

でも、変数に文字列を作り込んでおいて一発で投入して終わり!とやるより、ややダサいですね。
それでも求めたい結果は得られますし、70点くらいはあげたいですが。


理解のレベルがあがると、同じコードを見ても見え方が変わってきます。
No.18で基礎編動画セミナーは終わりですが、もう一度、イチから再復習してみてください。
ひとつひとつのサンプルから得られる学びの深さがまた変わりますよ。
(もちろん、その際に気づいたことについて再投稿していただいても可 ヾ(´ー`)ノ )


530 : 佐藤 尚子さんのコメント (2012-12-02 00:00:00)

NO.16コメント&追記ありがとうございました!お褒めの言葉いただいてとっても嬉しいです。励みにします。
NO.17問題1は&で10個のセルの値とカンマをつなぐ、しか思い浮かびませんでした・・・。
動きましたが何万件もデータがあったらどうしましょう~ですし、問題2には対応できないですね。
動画を見るとFor Next 構文で対応できるのですね。問題2はNO.16と同じ考え方なのですね。
今回自分が分かっていなかったなと思ったのは、変数は何も指定しなければempty値のままであることと、変数にデータをためていける(?)ことでした。どこかのセルに値を書き出すことばかり考えていましたが、その前に書き出すデータを作成して記憶させているのですね。
というか、そもそも「変数」ってなんなのかわかっていなかったです!テキストを見てみると、「名前のついた入れ物」「名前のついた箱」。データを入れ物や箱にいれるんですね・・。
発展編まであと一週間! 繰り返し練習します。


529 : ガラパゴスタディー事務局の回答 (2012-11-07 00:01:00)

加藤さん:

加藤さんは、本当に、受講生の鏡ですよ。
休日も、どんどんやってください。

「おもしろくてハマっている」という状態でどっぷり浸かっていると、気がつくとモノなっていた、という感じです。
ま、何ごとも、そうなんでしょうが。


528 : ガラパゴスタディー事務局の回答 (2012-11-07 00:00:00)

竹端さん:

応用編ぽい内容ではありますが、それでも、基本機能の組み合わせですね。


527 : 加藤美智子さんのコメント (2012-11-06 00:01:00)

簡単そうで難しい問題でした。(-_-)
忘れないようにしま~す!

N0.15では励ましのコメントありがとうございました<(_ _)>
仕事がどんなに大変でもフォローアップ問題だけはやると決めていました。動画が分かりやすいので、わからない問題も繰り返し見て解って来るようになるのが凄いです!

休日に復習もしま~す\(^o^)/


526 : 竹端博希さんのコメント (2012-11-06 00:00:00)

自力で良い線までいったんですが、結局、動画での答えを見て、納得してしまいました。意外にシンプルにまとまるんですね。


525 : 久武 美香さんのコメント (2012-10-29 00:00:00)

マッチングマクロ同様今回の問題のように重複リストを加工する業務も多くあります。
コピペして使っていたので、再受講前は自力では書けなかったので復習になりました。


524 : 大椛輝志さんのコメント (2012-10-24 00:00:00)

かなり実際の業務でありそうな課題になってきましたね。
カンマ見ると、半期ごとにcsvデータを作成し、社内のグループウェアシステムに飲み込ませた記憶がよみがえります。
今回のものはプログラムが簡単なわりに、使用頻度が高そうな、いい問題だと思いました。


523 : 有家 健司さんのコメント (2012-10-23 00:00:00)

初見では頭が真っ白になりましたが、方法を暗記します。ありがとうございました。
(問題2は自力で解けました)

Sub mondai1()
Dim gyo
Dim gyosha
Dim hurigana
For gyo = 2 To 11
gyosha = gyosha & "," & Range("A" & gyo).Value
hurigana = hurigana & "," & Range("B" & gyo).Value
Range("F2").Value = Mid(gyosha, 2)
Range("F3").Value = Mid(hurigana, 2)
Next
End Sub

Sub mondai2()
Dim gyo
Dim gyosha
Dim hurigana

For gyo = 2 To 27
If gyosha & "," & Range("A" & gyo).Value <> gyosha & "," & Range("A" & gyo - 1).Value Then
gyosha = gyosha & "," & Range("A" & gyo).Value
hurigana = hurigana & "," & Range("B" & gyo).Value

Range("F2").Value = Mid(gyosha, 2)
Range("F3").Value = Mid(hurigana, 2)
End If
Next
End Sub


1213 : 小川慶一の回答 (2012-09-13 08:19:00)

達人養成塾 小川です。

文字列操作に関する課題は、基礎編で扱ったものだけでも7割方解決できます。

発展編に、trim, replace 等紹介していますので、
こちらも見ておいてください。


1212 : 受講生さんのコメント (2012-09-12 17:19:00)

自作のコードは、もう一工夫足りなかったです。

でも、力技で何とか作れるようになってきたと思います。



midやleftが、ここで来るか!と唸りました。

こういう工夫が、モノを組み立てているって感じがして好きです。



Sub test()

Dim gyo

Dim gyosha

Dim furigana

For gyo = 3 To 11

gyosha = gyosha & "," & Range("A" & gyo).Value

furigana = furigana & "," & Range("B" & gyo).Value

Next

Range("F2").Value = Range("A2") & gyosha

Range("F3").Value = Range("B2") & furigana

End Sub





Sub test1()

Dim gyo

Dim gyosha

Dim furigana

For gyo = 3 To 27

If Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then

gyosha = gyosha & "," & Range("A" & gyo).Value

furigana = furigana & "," & Range("B" & gyo).Value

End If

Next

Range("F2").Value = Range("A2") & gyosha

Range("F3").Value = Range("B2") & furigana

End Sub


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

本講座の動画一覧

  1. 【動画1】 If文とForNext構文を組み合わせる
    【動画1】 If文とForNext構文を組み合わせる 未習得
  2. 【動画2】 複数条件を組み合わせた条件分岐
    【動画2】 複数条件を組み合わせた条件分岐 未習得
  3. 【動画3】 ElseIfを使った条件分岐
    【動画3】 ElseIfを使った条件分岐 未習得
  4. 【動画4】 出現回数を数える。CountIf関数がやっていることをマクロで書くと?
    【動画4】 出現回数を数える。CountIf関数がやっていることをマクロで書くと? 未習得
  5. 【動画5】 条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。
    【動画5】 条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。 未習得
  6. 【動画6】 条件に一致するデータを別シートに転記する
    【動画6】 条件に一致するデータを別シートに転記する 未習得
  7. 【動画7】 とびとびに存在するデータを拾って加工する
    【動画7】 とびとびに存在するデータを拾って加工する 未習得
  8. 【動画8】 文字列を加工してデータ転記する(その1)
    【動画8】 文字列を加工してデータ転記する(その1) 未習得
  9. 【動画9】 文字列を加工してデータ転記する(その2)
    【動画9】 文字列を加工してデータ転記する(その2) 未習得
  10. 【動画10】 文字列を加工してデータ転記する(その3)
    【動画10】 文字列を加工してデータ転記する(その3) 未習得
  11. 【動画11】 勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと?
    【動画11】 勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと? 未習得
  12. 【動画12】 残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ
    【動画12】 残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ 未習得
  13. 【動画13】 複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと?
    【動画13】 複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと? 未習得
  14. 【動画14】 文字列を様々に解析して条件分岐
    【動画14】 文字列を様々に解析して条件分岐 未習得
  15. 【動画15】 複数の記号に挟まれた文字列を取り出す
    【動画15】 複数の記号に挟まれた文字列を取り出す 未習得
  16. 【動画16】 各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ
    【動画16】 各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ 未習得
  17. 【動画17】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その1)
    【動画17】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その1) 未習得
  18. 【動画18】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その2)
    【動画18】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ