エクセルマクロ・VBA基礎編フォローアップ ベーシック
この講座は定額コースで利用可能です。この講座は購入可能です。

講座の概要
エクセルマクロ基礎編に対応した演習問題と動画解説です。
この講座の難易度:
この講座の教材ページ数: 18
この講座の動画の総時間数: 03時間28分34秒
この講座の投稿/コメント数: 876
受講を検討されているあなたへ
基礎編でお伝えした道具はシンプルなものばかりです。しかし、基礎編レベルの知識だけでもかなりのことができます。基礎編フォローアップ ベーシックは、基礎編で学んだ内容を定着させるための演習問題とその解説動画で構成しています。
もっと詳しく知りたい方≫≫この講座が含まれたセット講座紹介ページ
この講座の利用方法
講座を利用するには、以下の2つの方法があります。
- この講座を含む定額コースに参加する
- この講座を購入する
この講座を含む定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
この講座は、以下の定額コースに含まれています。
- 【お試し】初級コース(サポートなし) 980円/月 ~
- 初級コース 1,480円/月 ~
- 中級コース 2,980円/月 ~
- 中上級コース 3,980円/月 ~
-
この講座は購入可能です
(9,800円)
If文とForNext構文を組み合わせる
演習問題テーマ:If文とForNext構文を組み合わせる
基礎編講義本編で登場した、 If 文です。
今回紹介した
If 条件 Then
Else
End IF
の形は、丸暗記してください。
Visual Basic上、エクセル上で僕が字を書いたりしているときのショートカットキー操作は、しっかりマスターしてくだざい。「ハナコのステップ」等の基本パターンについても、ここで、しっかり慣れてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
複数条件を組み合わせた条件分岐
条件が2つあり、それが別の列にあるときの処理の仕方。まずはひとつの条件で動くマクロをつくり、それを使ってもうひとつの条件で動くマクロを1こ完成させるのが大事、For Next構文は最後です。ハナコのステップに忠実に従ってかいてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
ElseIfを使った条件分岐
If 条件 then
Elseif 条件 then
Else
End if
の形を使ったパターン。条件の数にあわせて、Endif条件thenを増やします。何度も出てくる同じフレーズは1個ずつ打たないでコピーペーストする習慣をつけてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
出現回数を数える。CountIf関数がやっていることをマクロで書くと?
変数の値を初期化(値を0にする)してからループを繰り返すパターン。
[1]出現回数をあらわす変数をたてて出現するたびに1つ増やす仕組み
[2]For Next構文で調べ終わったあとに最後の合計を表示する仕組み
[3]最後の合計を表示したらその変数の値を一度0に戻してから次のループに入る仕組みをよくみてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。
2つの表がある場合は変数を2つつくるパターン。
2つの変数とは、[1]左の表のどこを調べているか、[2]右の表のどこにかくか、をそれぞれ指定する変数です。ハナコのステップ3「カコウする」とき、左右どちらの変数の加工をしているかに注意して、関係するところだけを加工します。書き出す表のデータ間の行をつめて書き出すためには、1行かきおえて次にII何行目にかくかを指定する仕組みをつくることがポイント。
migi=migi+1の仕組みがどう動くかをよくみてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
条件に一致するデータを別シートに転記する
2つの表がそれぞれ別のシートにあるパターン。
調べているシート、書き出し先のシートが異なります。このような複数シートのときはシートを指定するのがポイント。調べているシートに限らず書き出し先のシートも含めすべての値のシートを指定する習慣をつけてください。マクロを実行するときにどこのシートを開いていてもきちんと動くマクロをかけるように。また、シート間の移動はtrl+PageUP,Ctrl+PageDownでスムーズに。2つの表がある場合に変数を2つつくるパターンは前回と同じ。変数をつくるときは、どんな目的で作った変数かがわかる変数をつくると便利です。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
とびとびに存在するデータを拾って加工する
とびとびのデータをどう扱うかをみてください。
とびとびの間隔に法則をみつけることが大事。法則をみつけたら、1、4、7、12のようにとびとびのデータを、Range("列名" & 変数×3−2).Valueと表現できるというのがポイント。すぐに法則がみつけられなくても実際にかいているうちにわかることがあるのでまずは動くマクロを1個ずつかいてみることが大事です。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
文字列を加工してデータ転記する(その1)
セミナーで学習したLeft関数、Mid関数、Instr関数をどう使うかみてください。
Instr関数をつかって区切りの字が何文字目にあるのかを調べる変数をたてるのがポイント。そうすると区切りの字の後からの情報がほしいときは変数+1、前までなら変数−1と表現できるということに注目。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
文字列を加工してデータ転記する(その2)
問題3で変数の使い方に慣れてください。
第7回の路線駅名を線と駅名以下にわける方法と基本的には同じことが変数を使えば実現できるというのがわかるかがポイント。基本的には1個を2つにわけるの繰り返し。1個を2つにわけ、わけたうちの1個を2つにわける。このときわけたうちの1個を戻り値とする変数をたてるのがポイントです。あとはInstr関数をつかって区切りの字が何文字目にあるかを調べる変数をたてれば、区切りの字の前か後かは変数-1、変数+1であらわせるというのは第7回と同じ。
問題4、5はInstr関数によって区切りの字の有無もわかるというのがポイント。
Instr関数をつかって区切りの字が何文字目にあるかを調べられると同時に、その字がない場合は値が0となることを利用して、If文を使って区切りの字が1つだけではない場合の処理ができます。またInstr関数はあくまでも区切りの字が何文字目にあるかがわかるだけなので「モノレール」の場合はどうするかよくみて学んでください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
文字列を加工してデータ転記する(その3)
Instr関数をつかって「" "」で、区切りの「スペース」が何文字目にあるのかも調べられるというのがポイント。
[1]Instr関数をつかって区切りの字(ここではスラッシュや半角スペース)が何文字目にあるかを調べる変数を使う
[2]区切りの字の前か後かを変数-1、変数+1であらわす
[3]区切りの字が複数ある場合はInstr関数が区切りの字の有無を判別することを利用してIf文を使う
の3点をしっかり復習してください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと?
項目が出現したらその回数ではなく隣の列の金額を加算する仕組みをつくります。
合計額をあらわす変数をたてること、For Next構文で調べ終わったら合計額を表示する仕組み、複数の項目がある場合に初期化してから次の項目の金額を新たに加算しはじめる仕組みは第10回と同じ。今月支払額合計を、初期化する前の各項目の合計額を利用して加算していく仕組みは、よくみると出現するたびに加算する仕組みと同じだということに気づいてください。
途中ででてくるGoukeiという変数をkobetsuに一気にかえるやり方もここで覚えてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ
勝ち抜き戦の基本パターン。
勝ち抜き戦勝者をあらわす変数をたてること、暫定勝者の値をきめること、暫定勝者と対戦相手の値を比較して値の大きいほうが勝者になり、次の対戦相手の値と比較するということを繰り返し、最後まで勝ち抜いた勝者が最も大きい値を示す仕組みを学んでください。
勝ち抜き戦の対戦相手が同じ列にいるか、複数の列にいるかによって、暫定勝者の値が列名と数字か、数字だけになるという仕組みもよくみてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと?
マッチングの基本パターン。
2つの表があるのでそれぞれの表に対応する変数をつくることが基本です。ひとつひとつていねいに、まず左の表のIDとマッチするところに右の情報をもってくる仕組み、次に右の表の情報を順番に全部調べる仕組みをつくります。
Ctrl+Zでマクロの状態を戻す習慣をつけてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
文字列を様々に解析して条件分岐
Len関数とInstr関数の復習。
1.Len関数の戻り値が文字列の長さ=文字数をあらわすことを利用したIf文。
2.Instr関数は戻り値が0かそれ以上の数字かによって、ある文字列の有無を示すことを利用したIf文。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
複数の記号に挟まれた文字列を取り出す
●●●/▲▲▲▲▲/■■■といった形でひとつのセルに格納された情報から、「▲▲▲▲▲」を取り出す。
といった具合に、複数回登場する同じ記号に挟まれた文字列を取り出すことがよくあります。
その方法を解説します。
Instr関数の引数指定がポイントです。
No.0015 - 問題(前半)
[1]
シート「問題」のセルE3の文字列を元にして、Left関数、Mid関数を用い、以下を行うマクロを作れ
セルF3に路線名を記入する
セルG3に駅名を記入する
セルH3に駅からの距離を記入する
[2]
シート「問題」のセルE3の文字列に対して、以下を行うマクロを作れ
セルI3に、2つのスラッシュのうち、左にあるものが左から何文字目にあるかを記入する
セルJ3に、2つのスラッシュのうち、右にあるものが左から何文字目にあるかを記入する
[3]
シート「問題」のセルE3の文字列について、含まれる路線名、駅名の文字数に関わらず[1]と同様の処理を行うマクロを作れ
[4]
[3]と同様の処理をセルE2-E51のすべての文字列に対して行うマクロを作れ
No.0015 - 問題(後半)
以下では、「RC」という文字列は「鉄筋コンクリート」を指し、「SRC」という文字列は「鉄骨鉄筋コンクリート」を指すものとする。
また、セルD2-D51では、左のスラッシュより手前には、RCとSRCしか出現しないものとする。
[5]
セルD3の文字列を元にして、セルI3-K3のように記入するマクロを作れ
[6]
セルD2-D51のすべての文字列に対して、[4]と同様の処理を行うマクロを作れ
[7]
セルD3の文字列を元にして、セルL3ように記入するマクロを作れ
[8]
セルD2-D51のすべての文字列に対して、[7]と同様の処理を行うマクロを作れ
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ
1つ上の行と比べて同じか違うかによってわりふる数字が変わるというのがポイント。
2番目の問題は、同じカテゴリーの中では順番に番号を1個ずつ増やしてわりふる仕組み、違うカテゴリーになったら先頭番号を1に戻してからまた順番に番号を1個ずつ増やしてわりふる仕組み、をよくみてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
表を解析して1行のリストを作る、1行のリストを解析して表にする(その1)
For Next構文のはじまりに条件をかくパターンと、For Next構文がおわったあとに処理するパターンを学んでください。
複数のセルの情報を1つのセルにまとめてかく際に重複をさける方法として、前回学習した1つ上の行と比べて同じか違うかによって戻り値がかわる仕組みを使います。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
表を解析して1行のリストを作る、1行のリストを解析して表にする(その2)
理解してから書くよりも、まず書いてみる。その結果をみてから考えて書きなおすという繰り返しが大事です。
並べ替え済みのリストから重複しないリストをつくる仕組みと、For Next構文の始まった直後と終わった後に特別な仕掛けをつくる仕組みをよくみて何度もマクロを書いてみてください。
このページのメモはまだありません。
学んでいて気になったこと、気づいたことなどをメモしましょう。
メモでは、このページでの学習内容に対するあなたの理解度、あなたにとってのこのページの内容の重要度を記録することもできます。
カンマが先頭に残ってしまったので、どのように処理するのか悩みましたが、
今回のMid関数やLeft関数を用いた、カンマの処理の仕方がよくわかりました。
何回も動画を見て、実践でも使えるようにします。
ありがとうございました。
引き続きよろしくお願いします。
今回のマクロの作成に当たって、まずは何も見ないで作成し、動画を確認しました。"モノレール"の部分でかなり時間が掛かりましたが、なんとか完成しました。
'[5]
'シート「Sheet2」で、E列にある路線駅名の「路線」情報をH列に、駅名以降の情報をI列に書き込むマクロを作れ
Sub test5()
Dim gyo
For gyo = 2 To 51
If InStr(Range("E" & gyo).Value, "駅") <> 0 Then '駅という文字が存在する場合
If InStr(Range("E" & gyo).Value, "モノレール") = 0 Then 'モノレールという文字が存在しない場合
Range("H" & gyo).Value = Left(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "線"))
Range("I" & gyo).Value = Mid(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "線") + 1)
Else 'モノレールという文字が存在する場合
Range("H" & gyo).Value = Left(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "ル"))
Range("I" & gyo).Value = Mid(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "ル") + 1)
End If
End If
Next
End Sub
小川先生こんにちは。
毎朝、30分程度、動画を見ながらマクロの勉強を継続しています。
6回繰り返し練習して、ようやく答えを見ずにマクロを完成させることができました。
少しずつですが、マクロを書くことに慣れてきました。
ここで質問があります。
シート「Sheet2」の課題で、「担当区域」列に、tiku = ""と書くと、業者別に担当区域ごとに記載されるとのことですが、tiku=""というマクロを書くと、なぜこのような現象が起こるのか仕組みがどうしても理解できません。
算数に苦手意識があるためかもしれません。
つきましては、このような現象が起こる仕組みをご教示いただきますようお願いします。
以前は相当理解に苦労した問題でしたが、
今回は完璧に理解できていました。
実務でもカウンタ変数を回して結果を書き出すマクロを作って役立ており、
苦労してマスターしたおかげだと思っています。
ポイントは、F8・ステップインで、1行ずつVBAの動きを確認し、
変数がどこで値を取得し、変化し、クリアされるかを丁寧に追っていく、
これを繰り返すことが、理解の早道だと思いました。
この章に関しての質問です。
このように連続したセルを転記する際に、Next構文使いたいのですが、どのように書けばいいでしょうか?
Sub ren()
Dim gyo
For gyo = 1 To 4
Range("A1:D1").Value = Range("G1:J1").Value
Next
End Sub
5分50秒ぐらいで動画が止まってしまうようです。
ご確認お願い致します。
ひたすら繰り返し入力して、指が覚えるほどにしなければならないと感じました。
マクロ記載に関する質問です。
".Value"を記載しなくても実行できるようですが、常に記載しなくても大丈夫なのでしょうか?
見た目すっきりするので良いかと思うのですが、場合によって支障が出たりするのでしょうか?
よろしくお願い致します。
こちらの回のみ、この動画は、再生できませんとなり
再生が出来ません。
ご確認いただけますでしょうか?
宜しくお願い致します。
結果は正しく出力されています。
以下プログラムです。
Sub mondai2()
Dim gyo
Dim tenki
Dim kuiki
tenki = 2
For gyo = 2 To 27
If Range("A" & gyo).Value <> Range("A" & gyo - 1).Value Then
Range("E" & tenki).Value = Range("A" & gyo).Value
Range("F" & tenki).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
tenki = tenki + 1
Else
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
End If
Range("G" & tenki - 1).Value = kuiki
Next
End Sub
完成した時、自分では上手く出来たと思ったんですが、
小川先生のマクロと比較するとパッと見はすっきり見えるものの、
A列を1行進むごとにG列に担当区域を書き込んでいくのは
データ量が増えると処理が重くなったりするのだろうかと思ったりもしています。
小川先生からみてどうでしょうか?
動画の1分前後あたりからおっしゃられている、「合計点数が100点以上の人だけを抽出して転記する方法」について
どの講座で紹介されていましたでしょうか?
現在、「エクセルマクロ・VBA導入編」「エクセルマクロ・VBA基礎編」を受講し終わった状態です。
ここに戻ってくると、そもそもVBAを勉強し始めたのは、何の目的だったのか等、原点に戻れる気がします。「アバウト過ぎて、びっくりする人がいる」けど、マクロ書く時はこんなものです。という言葉に、ハッとしました。(^^)
こうして、また戻って復習できるのは本当に良いですね。
システムからエクエルにデータを落とします。
2.この元データと入力済データを比較し異なっていたら
データを赤くする。
この2の段階をVBAで作りたいと思っています。
問題なのはこの中のtaikin1 とtaikin2 を比較する部分です。
単純に半日勤務課か一日勤務かなら問題はないのですが、
出勤時間が午前中で退勤時間が午後になる場合、
システムの仕様で退勤時間が12:00 になり
備考欄に文字列で退勤時間を入力するようになっています。
この午前・午後にわたる半日勤務のとき、
データが赤くなるときとならないと気が合って困っています。
この部分に★で印をつけてありますので
原因の説明と対処方法を教えてください。
この度はご返信ありがとうございます。
早速ですが、エクセルマクロ・VBA基礎編フォローアップ ベーシックの問題に取り掛かりました。
しかし、何度解いてもよくわからない点があります。
★【動画6】 条件に一致するデータを別シートに転記する で例えますと、
Sub ichi()
Dim i As Long
Dim k As Long
k = 9
For i = 4 To 13
If Worksheets("元データ").Cells(i, 9) > 100 Then
Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'ID
Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前
Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計
k = k + 1
End If
Next
End Sub
このような状態です。
解けてはいますし、回答を見ても正しいようなのですが、
k = k + 1の位置にいつも戸惑ってしまうのです。
Dim i As Long
Dim k As Long
k = 9
For i = 4 To 13
If Worksheets("元データ").Cells(i, 9) > 100 Then
Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'ID
Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前
Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計
①k = k + 1
End If
②k = k + 1
Next
End Sub
①の状態が正しいというのはif endの中に入れておくというルールのような形で覚えてしまっている状態です。
最初に書いた時点では②の位置に書いてしまうのです。
そしてエラーが出て①の位置に戻しています。
ハナコステップで書いているのですが…何度書いても分かりません。
原因と致しましては、以下のように考えているからだと思うのですが、
そもそも文の読み方が正しくないのでしょうか…
ご教示頂けますと幸いです。
Dim i As Long 'iを宣言します
Dim k As Long 'kを宣言します
k = 9 'kは9です。
For i = 4 To 13 'iは4です(1周目時点)
If Worksheets("元データ").Cells(i, 9) > 100 Then 'もしも元データのi4(1周目時点)が100を超えていたら
Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'IDをコピー
Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前コピー
Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計コピー
End If 'K9の値に入れるi4が調べ終わりました
②k = k + 1 'では次(i=5)に進む前にコピー先のセルも動かします
Next '(i=5)に進みます(forに戻ります)
End Sub
今まではrange("a1").va と書けばvalue がヒントで出ていたんですけど
worksheets("元データ").range(”a1").va と書いてもvalue がヒントが出てきません。
それからこれは元からそうでしたが
マクロを1行書いて上の行にカーソルを移動させたときRange("a1").Valueとなり、小文字から大文字に変わるべきところのうち""で挟まれた部分だけ小文字のままです。どうしてなのでしょうか?
お世話になっております。こちらの動画の後半で解説されていた路線駅名の処理について質問がございます。私はこのようにプログラムを書いて処理し、設問で指示された回答は出せたので問題ないと思うのですが、小川さんがこの方法を動画で取り上げなかった理由を教えてもらえないでしょうか?
If ku = 0 Then
ku = InStr(roseneki, "ル")
End If
過去のコメントでは、「「手順書としてどうか?」という問いですね。」という回答が小川さんから出されてました。他の人がプログラムをメンテナンスする時に分かりにくいから、という理解でよろしいでしょうか。ご回答宜しくお願い致します。
for構文とOffsetを使って書いてみましたので投稿します。他の方のコメントにあったランキングにも挑戦してみました。
繰り返せば繰り返すほど、新たな学びがあって本当に良い講座です。
Sub rensyu()
Dim c As Long
Dim cyoko As Long
Dim mx As Long
Dim cMX As Long
Dim cyokoMX As Long
mx = Range("H1048576").End(xlUp).Row - 6
With Range("C6")
cMX = 0
cyokoMX = 0
For c = 0 To mx
For cyoko = 0 To 5
If .Offset(c, cyoko).Value > .Offset(cMX, cyokoMX).Value Then
cMX = c
cyokoMX = cyoko
End If
Next
Next
Range("K4").Value = .Offset(cMX, -1).Value
Range("L4").Value = .Offset(-1, cyokoMX).Value
Range("M4").Value = .Offset(cMX, cyokoMX).Value
End With
End Sub
昨日基礎編ベーシックを一度終えたのですが、理解に不安があったので、動画8から2週目を行いました。
問題11、12、16(一瞬悩んだ)、18(2)が、少し悩みながらの回答でしたが、初回のような頭から煙が出そうという状態にはならずに済みました。
昨日の時点では、18(2)は手を動かしても自力回答できる気がしなかったのですが。。。
本日再挑戦して見たところ、悩みつつも手を動かしていたらいつの間にか解けててびっくりしました。( ゚д゚)
こちらの4問は引き続き、時間を置いてから再挑戦しつつ、アドバンスドに進みたいと思います。
昨日は初めて、マクロを書いている夢を見ました。(⌒_⌒;
この動画までは、かなり順調にきたのですが、ここで思いっきり躓きました(^_^;)。
同じ条件の「For~Next」と「If~End If」構文で、それぞれの列に異なった加算をするなんて。。。
まるで、左手でマルを書きながら、右手で三角を書かされているような(@_@;)。。。
この項に取り組んで、悩んで、解答を見て納得して、書いてみて、後日また取り組むと前回と同じことを繰り返す・・・みたいなことを何度か繰り返しても理解ができませんでした。
が、本日、同時に違うことを実行するのではなく、個々に考えてみようと思い取り組んだところ、時間も掛かりましたが以下のマクロを自力で書くことができました。
' 【資料番号】のみのマクロ
' こっちは、比較対象の上下の値が違ったら「変数」の値を「+1」するだけなので問題なし
Sub siryoubangou()
Dim siryoubangou
Dim gyo
For gyo = 4 To 19
If Range("D" & gyo).Value <> Range("D" & gyo - 1).Value Then
siryoubangou = siryoubangou + 1
End If
Range("B" & gyo).Value = siryoubangou
Next
End Sub
' 【資料ごとの番号】のみのマクロ
'
' こっちは、最初の「1」をどのタイミングで「変数」に代入するか。。。
' 「変数」を「2」「3」と増やすのは、どこのタイミングなのか。。。
'
' 「変数」をどこのタイミングで「0」の状態にリセットすればよいのか。。。
Sub siryousuuryou()
Dim siryousuuryou
Dim gyo
For gyo = 4 To 19
If Range("D" & gyo).Value <> Range("D" & gyo - 1).Value Then
siryousuuryou = 0
End If
Range("C" & gyo).Value = siryousuuryou + 1
siryousuuryou = siryousuuryou + 1
Next
End Sub
特に、資料ごとの番号のマクロは、「変数」をあっちこっちに移動したりしながら、実行の結果を見て悩んで、最終的には納得して「ここだ!」てとこに「変数」を書くことが出来たので、なんとなくですが長いトンネルの出口が見えてきたような気がしています。
あっ!「変数(「gyo」以外)」が長いのは、今回に限りです。
コロナウイルスのおかげで休日に家にいることが多くなったのと、以前から興味があったのと懐事情のタイミングが見事に合致したので習い始めたのですが、半世紀生きてからの手習いです。。。老化防止のため、まだまだ先は長そうですが、脳みそフル稼働させてやります(^o^)v。
今の所ヒント無しで正解はできるのですが、回答と見比べると余計な動きだったり見づらいプログラムとなってしまいます。
今までは変数をあまり使用しなかった為、変数に纏めることを意識したら、今回は余計な変数を作りすぎていました。(苦笑)
Goukeiという変数を、何故か途中で名前変更している。
kongetsu = goukei
画面左側にある値に、migi という名前の変数をつけている。(苦笑) など。
でも、VBAの勉強初めて1週間で、ここまでかけるようになってとても嬉しいです。講義に何回か出てきた可愛らしいスライド(ハナコのステップ)で一気に理解度が上がりました。
先ほど問題を解いたところ、回答エクセルに比べendifの数が1つ少なかったのですが、問題なく動きました。
【自分の書いたマクロ】
Sub gouhi()
Dim gyo
For gyo = 2 To 11
If Range("C" & gyo).Value = "男性" Then
If Range("D" & gyo).Value >= 80 Then
Range("H" & gyo).Value = "合格"
Else
Range("H" & gyo).Value = "不合格"
End If
ElseIf Range("D" & gyo).Value >= 70 Then
Range("H" & gyo).Value = "合格"
Else
Range("H" & gyo).Value = "不合格"
End If
Next
End Sub
【答えのエクセルのマクロ】
Sub GogakuFugokaku()
Dim gyobangou
For gyobangou = 2 To 11
If Range("C" & gyobangou).Value = "男性" Then
If Range("D" & gyobangou).Value >= 80 Then
Range("H" & gyobangou).Value = "合格"
Else
Range("H" & gyobangou).Value = "不合格"
End If
Else
If Range("D" & gyobangou).Value >= 70 Then
Range("H" & gyobangou).Value = "合格"
Else
Range("H" & gyobangou).Value = "不合格"
End If
End If
Next
End Sub
elseif(改行せず使用)はあまり使用しない方がよいのでしょうか。
もしすでに過去この件がお話しされていたら申し訳ございませんが、
ご教示いただけますと幸いです。
'シート2のG列の値がA列と一致した氏名と郵便番号B列・住所C列をシート5へ転記
Sub tenki()
Dim hida
Dim migi
migi = 3
For hida = 2 To 20
If Worksheets("Sheet2").Range("A" & hida).Value = Worksheets("Sheet2").Range("G" & hida).Value Then
Worksheets("Sheet5").Range("B" & migi).Value = Worksheets("Sheet2").Range("A" & hida).Value
Worksheets("Sheet5").Range("C" & migi).Value = Worksheets("Sheet2").Range("B" & hida).Value
Worksheets("Sheet5").Range("D" & migi).Value=Worksheets("Sheet2").Range("C" & hida).Value
migi = migi + 1
End If
Next
End Sub
変数が重なると、難しいです。変数の値を設定する行を間違えてばかりです。
疑問に思った点があるので、質問をします。
「gyo=6 To 33」と指定しているのに、中断モードで確認しているときに、最後の「Next」にきて「gyo」にカーソルを合わせると、「gyo=34」となります。
指定している33以上は、いかないかと思ったのですが、実際は、34まで進んでいます。
gyoの値を指定しているのに不思議です。
上手く説明できず申し訳ございません。
どうぞよろしくお願いいたします。
動画を見る前に、まず自分でやってみて、答え合わせに動画を見ています。
問題[1]は、出来たのですが、問題[2]でif文を重ねることが思いつかず、下記コードになりました。(>と>=も間違っています)
何度「構文エラー」が出て、修正してやっと出来た!と思い動かしてみたところ、すべて"不合格"となってしまいました。
ギブアップして、動画を見てif文を重ねるのだと納得しました。
時間がかかりますが、何度も演習問題を解くことが、自分の力になると信じて頑張ります。
今後もどうぞよろしくお願いいたします。
Sub gouhi()
Dim gyo
For gyo = 2 To 11
If Range("C" & gyo).Value = "男性" & Range("D" & gyo).Value > 80 Then
Range("H" & gyo).Value = "合格"
ElseIf Range("C" & gyo).Value = "女性" & Range("D" & gyo).Value > 70 Then
Range("H" & gyo).Value = "合格"
Else
Range("H" & gyo).Value = "不合格"
End If
Next
End Sub
「ElseIf Range("E" & gyo).Value = "平成" Then」ここはelse使えば、よかったんですね。
あと質問なんですが、"昭和"の箇所はRange("E2").Valueにも置き換えられると思うのですが、直接文字列を入力したほうが動作的には軽くなるのでしょうか?
Sub shouwheisei()
Dim gyo
For gyo = 2 To 11
If Range("E" & gyo).Value = "昭和" Then
Range("G" & gyo).Value = Range("F" & gyo).Value + 25 + 1900
ElseIf Range("E" & gyo).Value = "平成" Then
Range("G" & gyo).Value = Range("F" & gyo).Value - 12 + 2000
End If
Next
End Sub
下記のようなコードでもsheet2の解答と同じ結果になりました。解説をみましたが、本当に色々パターンありますね。
Sub hyou()
Dim gyo
Dim gyoshya
Dim furigana
For gyo = 2 To 27
If InStr(gyoshya, Range("A" & gyo).Value) > 0 Then
Else
gyoshya = gyoshya & "," & Range("A" & gyo).Value
furigana = furigana & "," & Range("B" & gyo).Value
End If
Range("F2").Value = Mid(gyoshya, 2)
Range("F3").Value = Mid(furigana, 2)
Next
End Sub
小川さんのコードはシンプルで読みやすいです。私が書いたコードだとだいぶ無駄がありますね。汗
下記がコードです。
Sub banngou()
Dim siryou
Dim gyo
For gyo = 4 To 19
siryou = Range("C" & gyo).Value
If InStr(siryou, "A") > 0 Then
Range("B" & gyo).Value = Replace(Mid(siryou, 3), "A", 1)
ElseIf InStr(siryou, "B") > 0 Then
Range("B" & gyo).Value = Replace(Mid(siryou, 3), "B", 2)
ElseIf InStr(siryou, "C") > 0 Then
Range("B" & gyo).Value = Replace(Mid(siryou, 3), "C", 3)
End If
Next
End Sub
このコードでやってしまうと、仮にA~Zまでを求める場合、パターンが増えるので大変だなぁと思いました。もう少し効率よく書きたいもんです。
調べてみたところ
motogyo = kai * 3 - 2 ’★
で
kai=1
なのに
motogyo=-2
になっています。
これは何故なのでしょうか?
--------------------------------------------
Sub kaitou1()
Dim kai
Dim motogyo
Dim listgyo
motogyo = kai * 3 - 2 ’★
listgyo = 1
For kai = 1 To 10
Range("C" & listgyo).Value = Range("A" & motogyo).Value & Range("A" & motogyo).Value
listgyo = listgyo + 1
Next
End Sub
動画と同じような型の転記処理をしているのですが、
転記元は動画と同じ行数程あり、
転記先は10行の表が横にいくつも並んでる状態です。
10行目を終えるとまたすぐ隣の列の1行目から始めたいのですが、どのようにかけばうまくいくでしょうか?
ご教授頂くと幸いです。
このため、エディタの書式タブで、左右の間隔や上限の間隔を調整しようとしても、入力できません。プログラムは書式の設定ができないのでしょうか。
早速実務でも使ってみました。
在庫回転率(売上原価÷期末在庫)
3以上=”A”
2以上="B"
1以上="C"
1未満="D"
#DIV/0!="在庫ゼロ"
と表示させたいと思いました。
数値になっている部分は、条件分岐しても問題なく動くのですが、
#DIV/0!は「実行値エラー"13" 型が一致しません」の通知がきて、
動きがそこで止まってしまいます。
(#DIV/0!は” ”で囲っています。囲わない場合赤字になりました。)
エラー値の場合、何か特別の処理をしなくてはならないのでしょうか?
(急ぎではないので、以降の講座で出てくるのであれば、その際に学習します。)
Alt→E→R
無意識に使えるよう練習します。
結果、3度復習したことになりましたが、マクロが思ったような動きにならない場合でも慌てずに修正できるようになり、ベーシックレベルの変数の考え方・使い方は完全に整理できたと思います。最初のころを考えると信じられません。
また3度目の復習ではなんとかベーシックのマクロを2時間程度で組めるようになりました。再度、アドバンスドにチャレンジします。
こんにちわ
先生の講義はわかりやくすてすらすら頭に入ってきます。
この調子で進めていきたいと思います。
[2]の回答を復習したとき、最後のfor next構文でお団子のとる範囲を間違えて最後の行を取りこぼしてしまいました。
間違いだということはすぐ理解できたのですが、
その時のマクロの実行結果が私の推測と違っていたので、質問させていただきました。私の推測では、F6に6が表示されると思ったのですが、実際はF7に表示されました。理由をお教えいただけますでしょうか。
復習で書いたマクロは以下のものとなります。
Sub countif_3()
Dim goukei
Dim gyo2
For gyo2 = 4 To 6
goukei = 0
Dim gyo
For gyo = 4 To 18
If Range("c" & gyo).Value = Range("e" & gyo2).Value Then
goukei = goukei + 1
End If
Next
Next
Range("f" & gyo2) = goukei
End Sub
ベーシックを終了してアドバンスドに移行予定でしたが
業務が繁忙であるため、6月末まではベーシックの復習中です。
本題にうつり、質問致します。
【質問】問題2について
下記コードを記入しても、合否結果が出力されません。
gouhi の変数に変換した途端出力されなくなりました。
そのため、この変数設定の仕方が良くないと推測されますが
何が悪いのかわからず、堂々巡りとなっております。
ご回答頂けると嬉しいです。
宜しくお願い致します。
ーーーーーーーーーーーーーー以下コードーーーーーーーーーーーー
Sub danzyo()
Dim sei
Dim tensu
Dim gouhi
Dim gyo
For gyo = 2 To 11
sei = Range("c" & gyo).Value
tensu = Range("d" & gyo).Value
gouhi = Range("h" & gyo).Value
If sei = "女性" Then
If tensu >= 70 Then
gouhi = "合格"
Else
gouhi = "不合格"
End If
Else
If tensu >= 80 Then
gouhi = "合格"
Else
gouhi = "不合格"
End If
End If
Next
End Sub
お世話になっております。カンマの使い方で1つ確認させてください。解説を見る前に自分で解いた時に、カンマを表示する時にコードとしてRange("F2").Value = Range("A2" & ",").Value としたのですが、実行時エラー1004となり、動きませんでした。
Range("F2").Value = Range("A2").Value & ","としたら可動しました。別の会の授業の中でのコロンを使用したRange("C2" & ":" & "E2").Value = 8のコードを参考に上記のようなコードとしたのですが、エラーがでました。確認したいのですが、これはどこがエラーの原因なのでしょうか。よろしくお願いいたします。
ところで、質問ですが、ドットバリュー(.value)は入力しなくても、
今のところ支障なく作動するようですが、この先 発展編にすすむとまずいことはでてきますか? 書店で購入した本が、range("A1").value等の
入力の場合、ドットバリュー(.value)は打たなくても問題がないという記述があったので、今まで入力していません。
For Nextステートメントについて質問があるのですが、For NextステートメントはRange("A" & i )のように書いてはいけないと今日言われました。
Cells( 1 , i ) のように書きなさいと。
理由としてはRangeでかくと
① 処理が遅い
② そんなコードを書いていると笑われる
との事です。
私は小川先生の講座で1年以上VBAについて勉強してきましたのでこの書き方に違和感はありませんでした。
ちなみにCellsの書き方も知っています。
そこで、小川先生がこの書き方でやってきているのは初心者に理解しやすいようにですか?上級者向けの講座ではCellsを使っているのでしょうか?
Rangeの書き方でも行の処理ならできるので良いかなと思っていたのですが今日、思いっきりその書き方はダメだよと言われました。
と、言うのも現在、東京都が行っている職業訓練というものでExcel VBA実践コースというのを受講しています。
2月から3ヶ月間のコースでまもなく終わりを迎えます。
その講師の先生から言われました。
その先生の教え方はものすごくわかりにくく、受講者のほとんどが授業を聞かずに自分たちでテキストを読み込んだり、ネットで調べながら勉強していたほどお世辞にも優秀な講師とは言えないです。
どこがダメか具体的に教えて欲しいといっても処理速度が遅いのと田中先生(Office田中)が言っていたからとしか説明してもらえませんでした。
私の中では信頼の置けない講師の方なので腑に落ちなくて・・・。
小川先生に直接質問させて頂きました。
今後もっと複雑なコードを書くようになったらRangeでの書き方はしなくなっていくのでしょうか?
ご教授、お願いいたします。
これは、、、難しい!初期化、変数を増やすタイミング、for next構文の最初と最後の処理、条件分岐等。。。まだ身についていないところの総復習が必要と感じた。
まずはフォローアップ ベーシックを1周できました。わかりやすい講義をありがとうございました!!!
講義中で行われていたように、変数の値を丁寧に追いかけることで理解につながりました。
「勝ち抜き戦・暫定王者・挑戦者」という用語を用いた説明が大変わかりやすく、すんなりと理解出来ました!
最初は理解できなかった(for next構文の中にfor next構文)が、復習するにつれだんだんとわかってきた。リアルでの例えがわかりやすくて納得できました!
[質問]
countif関数で=COUNTIF(C$4:C$18,"=" & E4)をなっておりますが、第2引数に"=" & をつけるのはなぜでしょうか(E4だけで動くと思うのですが)?
ハナコのステップの凄さを再認識しました。このマクロを上から書いたら訳わからなくなると思いました。
下記のようにコードを書きました。小川先生と同じように書いたつもりですが、動きません。実行時エラー5と表示されます。そこで試しにRange("C" & gyo).Value = Left(name, slush - 1)をRange("C" & gyo).Value = Left(name, slush )としたところ、動くようになりました(/は入ってしまいますが)。今回のコードにはもう1つ問題があります。半角空欄を認識していません。なぜダメなのかお手数ですが、ご回答お願いいたします。
sub renshu2()
Dim slush
Dim name
Dim gyo
For gyo = 2 To 11
name = Range("b" & gyo).Value
slush = InStr(name, "/")
If name = 0 Then
slush = InStr(name, " ")
End If
Range("C" & gyo).Value = Left(name, slush-1)
Range("D" & gyo).Value = Mid(name, slush + 1)
Next
End Sub
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
Range("C1").Value = Range("A1" ).Value & Range("A2" ).Value ですが、これをまとめてRange("C1").Value = Range("A1" & "A2").Value 左記のように書いたのですが、実行時エラー1004と出ました。これは何故動かないのでしょうか。宜しくお願いいたします。
こんにちわ
[2]の回答を作ったのですが、このような形でもいいのでしょうか?
Sub mondai2()
Dim siso
Dim kanpyo
Dim nomimono
Dim gyo
For gyo = 4 To 18
If Range("C" & gyo).Value = "しそ巻き無料" Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
nomimono = nomimono + 1
ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
kanpyo = kanpyo + 1
End If
Next
Range("F4").Value = siso
Range("F5").Value = nomimono
Range("F6").Value = kanpyo
End Sub
お世話になっております。解説見る前に過去の動画を見ながら作成していますが、模範解答のようにきれいにならないこともあります泣
問題4で下記のように作成しましたが、無駄が多いように感じています。(マクロ自体は、問題無く動きましたが…)
マクロを書くときに、シンプルに考える工夫などありますか。よく物事を複雑に考えすぎると言われてしまうので…
Sub mondai4()
Dim jusyo
Dim ku
Dim si
Dim gyo
For gyo = 2 To 11
jusyo = Range("C" & gyo).Value
ku = InStr(jusyo, "区")
si = InStr(jusyo, "市")
If ku > 0 Then
Range("F" & gyo).Value = Left(jusyo, ku)
Range("G" & gyo).Value = Mid(jusyo, ku + 1)
Else
Range("F" & gyo).Value = Left(jusyo, si)
Range("G" & gyo).Value = Mid(jusyo, si + 1)
End If
Next
End Sub
以下の件かなり参考になりました。
仕事上、ばれてしまうことがあるので朝、名前変数等急いで加工してしまいました。(まあそれだけではないですがまだまだ勉強の足りなさを感じております。)
もう一度書かれていた件は振り返り学習をしようと思います。
まだまだ発展まで行きませんが、確実に勉強していきたいと思っております。
丁寧な対応ありがとうございました。
前回の問題で勉強したので、今回の問題は何とか解けました!
ただ、小川先生が言っていた、やってはいけない書き方(worksheetsの記述を片方省く)を見事にやってしまい、マクロが思うように実行されず、修正に時間がかかりました(笑)
マクロを書くときにやってしまいがちなミスも学べるので、非常に勉強になります。
今回の質問は、文字が入った数値ex(13l)(じゅうさんパイプ)を数値のみの(13)にしたい場合うまくinstr関数left関数にしてもうまくできません。
なにが原因かそして改善策をどうしたらいいのかおしえてください。
ちなみにQRコードを読んだときに区切りとして出てくる”l”です。
もしかしたら”パイプ”と読まないのかもしれませんがこの区切りをなくし数値のみにしたいと思ってます。
よろしくお願いいたします。
トンチンカンな質問に対して丁寧に指導いただき、ありがとうございます。
[a]の基礎講座第1章8と9を見直したところ、自分の間違いに気がつきました。格納された変数は右辺で利用される。左辺に変数を持ってくるということは、変数を格納するということであり、私がIF構文ないでやっていたことは、一度格納したBANGOという変数の内容を変更していただけだと、ハッとしました。よくよく冷静になって自分のマクロを見れば明白な間違いなのに、基礎フォローアップベーシックも最終にさしかかるにつれて、少しずつできるようになってきた楽しさと自信から、一度学んだ基礎の知識を置き去りにして、練習問題を解いていたように思います。基礎を再確認するためにも、自分の間違えたマクロを元に小人ちゃんシートに反映もさせていきました。小人ちゃんシートを使うと自分の書いたマクロをキチンと一つずつ理解しながら、反映ができるので、とても良かったです。基礎ができていないことを先生にご指摘いただき、ここで改めて基礎の大切さに気づけて本当に良かったです。ありがとうございました。
----------------------------
>コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。
>このような関数の使い方は出来ないということなのでしょうか。という質問になります。
そういうご質問でしたか。
>関数(BANGO)に置き換えると
↑
ここで、用語を間違えています。これは関数ではありません。
>このような関数の使い方は出来ないということなのでしょうか。
↑
上記のとおり、BANGOは関数ではありません。
なので、「このような関数の使い方は出来ないということなのでしょうか」という質問には、回答不能です。
用語を間違えていて、機能への理解もできてない...ということなので。
このタイミングで、以下の動画を復習し、用語とその機能について、ご自身の知識を修正してください。
○基礎講座第1章8 - 変数を使ったプログラム、変数を使う意義
https://forum.pc5bai.com/lesson/page/104/
[a] まずは動画をひととおり見て、用語とその意味を確認してください。
[b] 次に、動画にあわせて、「こびとちゃんシート」を使って、こびとちゃんになったつもりで、一行一行、マクロのコードの内容をシートに反映させていってください。
[c] 上記のワークをしっかりやったあと、さらに、コメント番号10443のマクロを見直してください。
[d] それでもどこがどう問題なのか?が分からなければ、「こびとちゃんシート」を使って(*)、こびとちゃんになったつもりで、一行一行、コメント番号10443のマクロのコードの内容をシートに反映させていってください。
(*)こびとちゃんシートは19行目まではないですが、4行目から9行目まではFor Next構文に従っで実際に作業してください。10行目以降はやらなくてOKです。
[a]-[d] までのどこかで、何をどう勘違いしていたのか?ということについて、すっきり整理して理解できるかと思います。
無事に理解できましたら、[a]-[d] までのどこで問題解決できたか?お知らせください。
[e] もしここまでやっても分からなかった場合は、上記[d]のワークをやった結果のこびとちゃんシート、手書きワークをやりおえた状態のものをお送りください。
PDFファイルでもJPGファイルでもかまいません。スキャンまたは携帯で撮影した画像。どちらでも構いません。
ファイルをお送りいただけたなら、そのファイル、コメント番号10443のマクロを使って解説します。
[a]-[d]のワークは、とても面倒に感じられるかもしれません。
でも、なぜ、講座本編でもわざわざこういうワークをやる時間を取っているのか?というと、それは、こういう手書きワークはとても重要だからです。
それに、多少手書きワークをしたとしても、基礎編フォローの演習問題にチャレンジするのにかかる総時間と比べたら微々たるものですので、ここは面倒でもやってみてください。
漫然とマクロを実行しているだけのときとは比べようのない大きな学びを得ることができるでしょう。
Sub XXX()
Dim kuiki
Dim gyosha
gyosha = 1
Dim gyo
For gyo = 2 To 27
If Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
gyosha = gyosha + 1
Range("E" & gyosha).Value = Range("A" & gyo).Value
Range("F" & gyosha).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
Else
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
End If
If Range("A" & gyo).Value <> Range("A" & gyo + 1).Value Then
Range("G" & gyosha).Value = kuiki
End If
Next
End Sub
-------------------------
今回の2つ目の問題を↑のように解いてから動画を見ました。
このマクロであれば最初と最後の処理を必要としないので良いような気もするのですが、なんとなく格好が悪い気もします。
最初と最後の処理をするマクロを自分で導くのは正直自分には難しそうと尻込みしてしまいますが、自分で導くためのプロセスを順を追って動画で紹介して下さっているので、とても勉強になりました。何回もこの動画を見直して練習したいと思います。
復習問題は、きちんと理解できたか確認できるので、
解いていて楽しいです。
次々新しい道具を欲しがる前に
少ない道具を使いこなす(考えずに体が動く)ことを目指します。
本編で学習から約2週間たっていたので
記憶も朧でしたが、回答できました。
スラスラとは程遠く、
記憶を呼び起こすように一行ずつ動作確認しながらですが、
最終的に動いたときの喜びは大きいですね。
ただ、絶対的な練習量が少ないので、
何度も復習=マクロを書いて、
問題を見た瞬間に体が動くようにしたいです。
(九九のようにですよね)
そこで質問です。
今回は見本回答がE列にあること、転記データが「第●回」で始まるので、不足分があることにすぐ気が付きますが、実務でデータ総数が多い、小川先生はどうしますか?
まずマクロの実行確認として最終行まで転記されているかを確認し、最終行と違ったら⇒for bangou =1 to ●の「●」の範囲が足りないことを推測し、例えば適当に10足したりしますか?
動画を見る前に回答できました!!
うれしいです!
ただ、タイプが遅い&ミスが多いため時間がかかります。
小川先生のお話にある「体が動かせる」はとても重要ですね。
一気に難易度が上がった感覚があるのですが、
おそらく基礎編の理解が不十分だからなのだと思います。
先生の言葉にあったように、回答を鵜呑みにしてとにかく練習を繰り返そうと思います。フォローアップ講座を進めながら、同時並行で本編の復習を開始します。
「下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
初め関数を使っていたのですが、資料番号が表に記入されませんでした。
スッテプインで一つずつ確認しても
問題なく実行出来ているように見えるのですが、
どうしてエクセルに反映されないのでしょうか。」
つまり、コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。このような関数の使い方は出来ないということなのでしょうか。という質問になります。
紛らわしい書き方をしてすいません。
よろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーー
>受講生 さん:
コメント番号10378で投稿されたマクロは以下。
Sub AAA()
Dim GYO
For GYO = 4 To 19
Dim NAME
NAME = Range("D" & GYO).Value
If NAME = "資料A" Then
Range("B" & GYO).Value = 1
ElseIf NAME = "資料B" Then
Range("B" & GYO).Value = 2
ElseIf NAME = "資料C" Then
Range("B" & GYO).Value = 3
End If
Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
Next
End Sub
そして、今回お送りいただいたファイルのモジュール「Module1」にあったマクロは以下です。
Sub AAA()
Dim NAMAE
Dim BANGO
Dim GYO
For GYO = 4 To 19
NAMAE = Range("D" & GYO).Value
BANGO = Range("B" & GYO).Value
If NAMAE = "資料A" Then
BANGO = 1
ElseIf NAMAE = "資料B" Then
BANGO = 2
ElseIf NAMAE = "資料C" Then
BANGO = 3
End If
Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
Next
End Sub
自分で気づかないうちに間違った操作をしてるのかもしれないです。
お手数おかけしますが、添付ファイルの確認お願いします。
---------------------------
>受講生 さん:
動画の5分あたりから扱っている、2つ目の問題ですよね。
ちゃんと動きますね...。
ファイルごと送付いただけますか。
よろしくお願いいたします。
>今、僕の環境で試しました。
>が、きちんと動作しますね。。
>これとは別のマクロのことでしょうか。
>でしたら、添削して欲しいマクロを別送してください。
いえ、下記のマクロのことで間違いないです。
きちんと動作しましたか、、、
先生に質問する前にも、エクセル、パソコン自体の再起動をかけて
試して見たのですが、きちんと動作せず、
先ほど、もう一度、先生にご指摘頂いた点を修正して
実行しましたが、やはりB列への反映がされませんでした。
>[1] Dim NAME は、 For 文より前に持っていく
for文の中にいつもDIM XXXを入れていました。
説明を頂いて初めて、よく考えてみればそうだなと気づきました。
ありがとうございます。
>[2] 変数名は NAME でなく他の言葉推奨
もう一度、変数を活用するときの注意点を復習してみます。
ありがとうございます。
ーーーーーーーーーーーーーーーーーーーーー
> 下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
> 初め関数を使っていたのですが、資料番号が表に記入されませんでした。
> スッテプインで一つずつ確認しても
> 問題なく実行出来ているように見えるのですが、
> どうしてエクセルに反映されないのでしょうか。
↑
今、僕の環境で試しました。
が、きちんと動作しますね。。
これとは別のマクロのことでしょうか。
でしたら、添削して欲しいマクロを別送してください。
いただいたマクロについては、以下の2点修正したいですね。
[1] Dim NAME は、 For 文より前に持っていく
[2] 変数名は NAME でなく他の言葉推奨
[1] は、いただいたマクロのような書き方だと、くり返しの回数だけ変数を作り直すことになります。僕の提案の方法なら、一度作った変数の中身を差し替えていくだけ。
というか、「同じ名前の変数を何度も生成し直す」ということ自体、プログラミングでは推奨されません。
[2] については、基礎編本編第1章「基礎講座第1章9 - 変数を活用するときの注意点」をまずは参照。
https://forum.pc5bai.com/lesson/page/105/
英単語一語の変数名だと、実在するプロパティ等とかぶる危険性が高いです。(そして、実際、かぶってます)
<>という発想がなく、先生の解説を見て目から鱗でした!
下記マクロを書いて、自分では出来た!と思っていたので、
問題の意図が掴めていなかったことに少しショックでした。笑
教材で<>を見た時、この比較演算子はどんな時に使うんだろうと
思っていましたが、こういう使い方ができるんですね。
マクロがよりシンプルになるので、
このパターンをきちんと体得できるように
繰り返し練習したいと思います。
質問
下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
初め関数を使っていたのですが、資料番号が表に記入されませんでした。
スッテプインで一つずつ確認しても
問題なく実行出来ているように見えるのですが、
どうしてエクセルに反映されないのでしょうか。
Sub AAA()
Dim GYO
For GYO = 4 To 19
Dim NAME
NAME = Range("D" & GYO).Value
If NAME = "資料A" Then
Range("B" & GYO).Value = 1
ElseIf NAME = "資料B" Then
Range("B" & GYO).Value = 2
ElseIf NAME = "資料C" Then
Range("B" & GYO).Value = 3
End If
Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
Next
End Sub
下記のマクロは、私が書いたマクロなのですが、解説動画を見て、
GOKEI=GOKEI+1の位置をRange〜の後に持ってくれば、
GOKEI=4にしなくて良かったんだと気づきました。
また、先生のマクロでは、if文のお団子部分のRangeを各列ごとに分けてマクロを書かれているのに対し
私はA8:C8という風に複数範囲をしてしたマクロを書きました。
今回は問題なく実行できたのですが、このような書き方が問題になることはありますか。
先生のように各列ごとに分けてマクロを書く方が良い理由など教えて頂きたいです。
※マックを使っていて、マクロをタイプする時、全て大文字入力になります。
基本、次の行に移った時に自動的に小文字大文字の調節がされるのですが、自分でつける変数名などは大文字のままです。
特に問題はないのですが、若干の見にくさを感じています。
もしこの設定の仕方をご存知でしたら、併せてお答え頂けると嬉しいです。
ーーーーーーー
Sub ZANGYO()
Dim GOKEI
GOKEI = 4
Dim GYO
For GYO = 8 To 17
If Range("C" & GYO).Value > 100 Then
GOKEI = GOKEI + 1
Range("F" & GOKEI & ":" & "H" & GOKEI).Value = Range("A" & GYO & ":" & "C" & GYO).Value
End If
Next
End Sub
ーーーーーーー
時間がかかっちゃいました。別にさぼってたわけでないのですが、歴史の勉強のようにざっと一通りしてみてというのがイヤで時間がかかってもじっくりしたいので予定より大幅に遅れましたが、後半もこだわってこだわってやっていきたいです。変なvbaスクールにいってた時期があり、いまさらですがほんとお金を含め無駄でした。はやくこのサイトを探しだせればよかったんですが。。。
ボヤいても仕方ないのでまたつづきがんばります。
それからgt=gt+1, id=id+1 ほんと重要だとわかりました。しそまき問題で出てきましたが、いろんなコードでよく見る場面ですので困ったら使えないか考えるようにします。ほんと勉強になります。
2月に基礎編を申し込んで、やっと基礎編フォローアップになりました。奥が深く大変為になります。すみません、教えて頂きたいのですが、出勤簿の精査をしていますが、人数が5.60にんいて、それを毎回一覧表に転記してから、画面と見比べてチェックしています。それぞれのブックを開いて、一覧表に転記すると言うマクロの講座はありますか?このブックを開く関数や変数の使い方が難しくて、さっぱりわかりません。
トライし完成しました。たまにですがコードを入力しながらどの部分をdim定義しようか迷う場面がよくあるのですが、1つずつコードを作っていくと見えてくるもんですね。不思議です。ハナコステップの前段のダンゴをどう作ったらいいか、、、ダンゴを練っていくと見通しが立つものですね。これもこのわかりやすい講座のおかげ
です。早く発展編、フォーム編へ行きたいです。
意識して入力してます。/が2つありましたがすらすらできました。
久々&で挟む場面もあり復習になりました。今度は途中経過なく
一発でできるか検証したいです。ほんとわかりやすいです。
>演習には、パターンをしっかり学ぶということを意識して取り組んでください。
⇒上記アドバイス、ありがとうございます。フォローアップはアウトプットのみのイメージでいたのですが、「パターンを覚える」というインプットの要素もあることを意識します。
今後ともよろしくお願いします。
先生の正解に近づくにはロジカルシンキングの様なものが欠如しちるように思えるのですが、何かアドバイス頂けないでしょうか?
Sub enari()
Dim kek
Dim omi
Dim syu
Dim gre
Dim omihuku
Dim gyo
kek = 0
omi = 0
syu = 0
gre = 0
omihuku = 0
For gyo = 4 To 10
If Range("I" & gyo).Value = "?????j??" Then
kek = kek + Range("J" & gyo).Value
ElseIf Range("I" & gyo).Value = "??????????" Then
omihuku = omihuku + Range("J" & gyo).Value
ElseIf Range("I" & gyo).Value = "?o?Y?j??" Then
syu = syu + Range("J" & gyo).Value
ElseIf Range("I" & gyo).Value = "???O" Then
gre = gre + Range("J" & gyo).Value
ElseIf Range("I" & gyo).Value = "????????" Then
omi = omi + Range("J" & gyo).Value
End If
Next
Range("D4").Value = kek
Range("D5").Value = syu
Range("D6").Value = Range("C6").Value
Range("D7").Value = gre
Range("D8").Value = omi
Range("D9").Value = omihuku
Range("E4").Value = Range("C4").Value + kek
Range("E5").Value = Range("C5").Value + syu
Range("E6").Value = Range("C6").Value
Range("E7").Value = Range("C7").Value + gre
Range("E8").Value = Range("C8").Value + omi
Range("E9").Value = Range("C9").Value + omihuku
End Sub
msgboxを作り値の検証をしてやっとわかりました。
C列の暫定勝者とD列の暫定勝者を比較し、D列が勝ったら
RETSU="D"を設けないとだめですよね。。。
地道にやって理解できまずはほっとしてます。
実務でも同じような場面がありそうでほんとに役立つ講座です。
解説講義を見て、「なんとなくわかったつもり」では
いけないので見た後に復習をしましたが、できませんで
した。やることは単に各列の勝者を比べるだけなのですが
、retsuを変数にしretsu="c",,,ということがつかみきれず
worksheets(1)range("a1"),,,,,て書いていたりrange("a1"),,,,,とあったりどうちがうのかわかりませんでした。同じ意味なのか違う意味なのか。当たり前かもしれませんがどのシートを実行させるのか
ってことですね。こんな初歩的なことでもぼくにとっては重要です。ほんといい講座です。
ほんとわかりました。2つのfor nextを頭の中で同時に動かすから
混乱するようです。1つのfor nextを止めてもう1つのfor nextを動か
していけば見通しがたちました。あとはカウンターをどこで0に
リセットするかですよね。現場の第一線のプログラマーもやはり
紙に書きだしたりすることあるのでしょうか?
ないと思いきやその通りでした。しそ巻き問題といいこの問題と
いいほんととっつきにくいものでした。が画面ばかり見ても仕方
ないのでいつもあるように「紙に書いて」みればよく流れが見えました。わからないときこと紙に書き出せば見えるものですね。
Sub mondai2()
Dim hida
Dim migi
Dim Kuiki
migi = 2
For hida = 2 To 27
If Range("A" & hida).Value <> Range("A" & hida - 1) Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
Kuiki = Range("C" & hida).Value & "地区"
Range("G" & migi).Value = Kuiki
migi = migi + 1
Else
Kuiki = Kuiki & "," & Range("C" & hida) & "地区"
Range("G" & migi - 1).Value = Kuiki
End If
Next
End Sub
重複した業者名が続くと『区域』を毎回書き直すのがカッコワルイと感じてはいますが、最初と最後の特殊な制御は不要になるので、メンテナンスはしやすく、これはこれでアリなのではと思っています。一方、処理が重くなったり遅くなったりするというデメリットもあるかも知れないのですが・・・どうでしょうか。
四苦八苦しながらcellsで動くマクロを作成(過去に投稿された方のコードと全く同じ)し、それから動画を見ました。
ところが、そのエレガントとは言えない方法(ベタな方法)が解説されている動画を見て、自分の考え方に根本的な誤りがあることに気づきました。
つまり『まだ白帯の私が高度な技を憶えようとするのは早すぎる。学んだことを徹底して反復練習することが先決』ということです。
実際、ベタな方法でコードを書くのには、15分もかかっていないのに、慣れないcellsを検索して試行錯誤するのに3日もかかってしまいました。
cellsという手法もどうやらベストではないらしく、for each構文その他、将来学ぶべきことはまだあるらしいということも知りました。
もう、ネットで検索するのに時間を費やして演習時間を減らすという迂遠な方法は止めます。
たぶん、この講座のカリキュラムに沿って学ぶ方が、最速でマクラー(マクロを自在に操れる人。そんな言い方するのか不明)になれる気が本当にするからです。
今後もよろしくお願いします。
コードの意味は深く考えず、最終行なのでROWで下からぶつかったところ・・・?と想像しつつ、とりあえず活用させていただきます。
ここまでの動画の練習問題も日々の業務に本当に役に立っていて、毎日進化中の自分、数週間前の私とは明らかに違って、魔法にかかっているみたいです。
発展編へ向けて頑張ります☆
以前解説があったかも知れませんが、ピリオドを打った後(Range("A1").⇐これ)の候補リストが、今回のマクロを記述する際に表示されないのは、vbeの仕様なのでしょうか。
今回の問題は、動画5で学んだことが直接活かせる問題でした。
途中で考え込むこともなく、サラサラとコードを書いている自分にびっくりですw
今までのマクロはシートが別だと全く用をなさなかったですが、マクロの中でシートを指定すれば、どのシートからでも動かせるんですね。
面白いなぁ~
元データを一つ一つ検索ソフトに打ち込んで、半日くらいかけて行うこともしばしばあって何とかならないかと思い始めて数か月になります。
先日、職場でプログラムを書き上げて一気に終わった仕事を見て、あまりの気分の良さに定時でさっさと帰ってきました♪
毎日の業務なので、検索値の最終行を自動で判断してくれるようなマクロを書けるようになると、さらに楽になるのに。。。と淡い期待を抱いています。
一週間先の自分が楽しみな毎日です。
goukei=goukei+1 どこにコードを書くかゆっくり考えればできそうです。
だめならどこかに入れてf9で1つ1つどうなるか検証ですね。
何か数えるときはこの式がでるように記憶します。
質問に対するご指導、
ありがとうございました。
[a] Dim ... , Dim ... という変数宣言を、
Subプロシージャ先頭のほうで固めた方が良さそうな気がするけど、
[c] 変数が登場する順序と、それらの変数を使う順序は
一致していた方が良いのかな?
と思っていましたが、正確に表現できていませんでした。
宣言してから、値を格納するという点、
動画を復習します。
今後ともよろしくお願い致します。
実際に変数を記述した式の順番、
これについて教えて頂けますでしょうか。
変数を、「必要だ」と自分が気付いた順番で記載すると、
'dim jusho
'jusho=range("C2").value
'dim ku
'ku = instr(range("C2").value,"区")
'dim gyo
'for gyo = 2 to 11
の順番になりました。
その後、'jusho=range("C2").value の("C2")の箇所を
'"(C & gyo)"に変更すると、
添付のようなエラーが出てしまいました。
これはおそらく、
「gyoという変数を宣言する前の行の記述にさかのぼって
"C2"の箇所にgyoを当てはめて使ってはダメだよ」
という意味だと思うのですが、
変数を宣言する(dim)記述と、
変数を定義する記述は、どの順番で書くのが正しいのでしょうか。
2つ以上の変数が必要になった場合、
必要だと判明した順番で書くと、
上から順に、'dim ばかりにはならず、きれいに揃いません。
それを整理しようとした時に、
どういう順番で整理するのが正しいのかをご指導願います。
講義は有難いのに、私が吸収できません。
申し訳ございません。
講義動画、4分26秒の箇所で質問です。
C4から18までの「しそ巻き無料」の回数を数えたかったので
添付ファイルのような式を書きました。
すると、
エクセルシート名:キャンペーン名簿1のセルF4に
「1」という答えが出て、間違えました。
小川先生の回答は、
' If Range("C4").Value = "しそ巻き無料" Then の後が、
'goukei = goukei + 1
になっています。
私が書いた式だと、
どういう意味になってしまうのでしょうか??
もしかして、
goukei = goukei + 1 の部分で、
「しそ巻き無料」の回数を累計させているのでしょうか??
ご指導、お願い致します。
ありがとうございます。
はじめに見ていただいたマクロと比較するとInstr関数の引数の指定のない部分がちがっていますね、、、。
惜しかったと思わずに、しっかり復習してできるだけたくさんのマクロをかいてスキルアップしていきたいと思います。
これからもよろしくお願いします。
問題3を以下のように解きましたが、どうでしょうか?
Sub again3()
Dim sen
Dim eki
Dim toho
Dim kuri
Dim jyusyo
For kuri = 1 To 51
jyusyo = Range("E" & kuri).Value
sen = InStr(jyusyo, "線")
eki = InStr(jyusyo, "駅")
toho = InStr(jyusyo, "歩")
Range("H" & kuri).Value = Left(jyusyo, sen)
Range("I" & kuri).Value = Mid(jyusyo, sen + 1, eki - sen)
Range("J" & kuri).Value = Mid(jyusyo, toho + 1)
Next
End Sub
アドバイスお願いいたします。
練習してみて気づいたのが、
例えば(実務で使っているデータ)、
右のリスト(元となる表データ)の変数
左のリスト(合計の算出先)の変数をつくり、
動画と同じようにハナコでくくってもなぜかうまく動かないなと悪戦苦闘していたところ、
右のリスト(元となる表データ)の箱を先につくり、
左のリスト(合計の算出先)でくくらないとうまくいかないのですね。
順番を逆にしていたのでうまくいかず、うんうん唸っていました笑
うまくいったときはとてつもない快感でした!
頭がこんがらがるときは、「こういうときはこうする」と一旦日本語で
口に出すと整理できました。
ちょっぴり恥ずかしい方法ですが、マクロとにらめっこしても答えは出ないと思うので、こういうことでも繰り返し行うことで、日本語を書くように深く考えなくてもマクロが書けるようになるのではないかなぁと思っています。
引き続き学習いたします。
演習問題は、ある程度ゴールがわかっている状態からのスタートですが、たどり着くのにまだ試行錯誤が必要なレベルです。
実務でここまですぐにマクロが書けるようになるまでは、まだまだ訓練が必要だと思うので、引き続き学習していこうと思います。
文字列を扱う関数はだいぶ慣れてきましたが、まだ頭をひねらないと答えに行きつかないので、繰り返し演習問題を解いていきたいと思います。
⇒該当の文字列が何文字目にあるかだけでなく有無も判断ができるという部分
段階的に理解ができるようになっているので、改めて素晴らしい教材だと思いました。
引き続きよろしくお願いします。
(昔の私も、さくっと解いていたようですが・・・(;´・ω・))
2つのForNextとif文を使いこなす点で
しそ巻きカウントの手法をマスターしたという実感が湧きました。
一つ気がついたのは、
ある目的値の該当が見つかったら、もう比較を続ける必要がないので
そのIF文を終わらせて、次の比較値に進むようにすれば
処理は速くなるだろうなということです。
今回は加算していく比較ではなく、ただ1つの該当値を見つけるための比較だからです。
(IF文を抜ける文法自体は忘れましたが、手法として思いつきましたので
書いてみました)
gooska
勝ち抜き戦マクロ、以前この仕組みを考えるときに
冬季五輪のジャンプ等の競技をイメージしたことを
思い出しました。
変数に初期値を与えて、1行ずつ変数値と比較していき
値が上回ったら変数を書き換える仕組みですね。
正解をみて、無駄なステップを多少修正しましたが、
今回も順調に解けました(*´▽`*)
おかげさまで、基礎編で学んだ素材だけでマクロを作る手法には
だいぶ自信がついてきました。
今後もフォローアップの問題を進めながら、
そろそろ発展編に取り組もうと思います。
年明けからの職場では、他人が作ったマクロを実務で運用することになるので
一般的な基礎知識を広げておく必要を感じるからです。
まだまだだと思いますが、引き続きよろしくお願いいたします。
gooska
ForNext文については元々よく利用していましたが、
当時と違うことは、それほど頭で考えなくても書けることだと思います。
だいぶ体に染み込んできてくれているようです。
Left関数や、Instr関数を扱うのも久しぶりなので、
一つずつ動作の確認をとる1行マクロを試しながら、
自力で回答できました。
(知っている関数だけれど、引数などをはっきり覚えていない時にどうするか?の練習にもなりました)
ところが、先生の動画を見て、
「同じ文字列を変数に置き換える」というステップが
足りなかったことに気がついたので、
もう一度書き直してみます。
実は、instr関数の値に+したり-したりをずらずら書くと
結構間違いやすくて修正も増えるので、
「あれ?昔解いた時、こんなに複雑な長い式だったかな・・」と思ったんですよね。
可読性とミスを減らすためにも、変数を上手に使う必要が
ありますね。
gooska
私が考えたのは、
変数*3+1で、その代わりに変数の範囲を
0 to 9 にするというものでした。
同じ結果が得られたので、悪くはないと思いますが、項目の数が10個でしたから、
やはり1 to 10 にして得られる法則にするべきだなと感じました。可読性という点で、
後で時間が経ってからプログラムを読んだときに、なぜ 0-9なのか?をいったん考えないといけなくなるからです。
先生の[1]の回答を見てからは、[2]はすぐできました。
今レベルの私が楽しいと感じる部分は、
この規則性をいかに見つけるかの作業ですね。
マクロは規則的な処理が得意なので、こびとちゃんには得意なことをさせてあげればいいわけです。
gooska
実はこういう基礎の基礎みたいな部分が抜けているので、多分応用がきかないのかもしれない、なんてちょっと思っております。
引き続きよろしくお願いいたします。
前回のしそ巻きカウントで十分に復習を積みましたので
今回の問題は、どちらも完璧でした(≧▽≦)
条件を満たす時だけカウント変数に1が加算される
という仕組みが、解いていて心地よく楽しいです。
ちょっと脇道なのですが、
職場に、MS officeの元セミナー講師だった人がいて、VBAにも詳しいというので、
「今、COUNTIF関数をVBAで書く演習を解いていて
なかなか楽しい」話をしたんですね。
解き方として、gokei=gokei+1のように条件を満たしたときに
加算していく方法だと説明したところ、
関数をそのままVBAに書く方法があるよ、と
話をさえぎられてしまいました(;´・ω・)
ワークシート関数を、そのままVBAに書く方法があることは
私も少し見聞きしたことはありますし、
発展編など先の講座へ行けば学べるのかもしれませんが、
今のところ、私が知りたいのは
ワークシート関数をそのままVBAで実行する方法と
今回のように、別の手法で同じ結果を得る方法と
処理速度としては、どうなのか?
ということです。
小川先生の見解をざっくりお話いただけましたら
幸いです。
gooska
実務だととにかく動けばよいという感じだったので、マクロにしようと思っていなかったというのもあります・・・
内容的には以前の講座の応用でしたが、変数を0に戻すか戻さないかがどう影響するのかを復習できました。
引き続き学習を進めていきますので、よろしくお願いいたします。
Sub rensyu1219_001()
'しそ巻きカウント
Dim gokei 'カウント数
Dim migi ' カウント数を記入する場所の行位置の値
Dim hidari ' 項目が書かれているリストの行位置の値
For migi = 4 To 6 'カウント数を記入する行位置範囲の指定
gokei = 0 '一つループが終わったらgokeiを初期化する
For hidari = 4 To 18 '一つの項目について該当したらgokeiに加算する
If Range("c" & hidari).Value = Range("E" & migi).Value Then
gokei = gokei + 1
End If
Range("F" & migi).Value = gokei 'この時点での加算結果を書き込む
Next
Next
End Sub
正解と異なる点は、1項目のカウントが終了した時点で
合計値を書き込むタイミングです。
endIfで個別の行の判別を終えた後、nextで次の行へ移る前に
カウント値を書き込んでいます。
こうすると、1行ごとのカウント値が「見える化」し、
上書きを繰り返すことによって、最終的には正しいカウントが
書き込まれますね。
これは確信犯的にそうしたわけではなく、
「どこでカウント値を書き出すか」のタイミングにまだ迷いがあったため
nextで戻る前に置いてみただけなのです。
どこでgokeiを初期化するかで迷うのと似ていますね。
入れ子のnextから抜けるときにgokeiを記入し、初期化し、
それから次の行の項目に移動する、が正しい流れですね。
でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
それ自体面白いし、使える局面があるかもと思ったので、
ご紹介しました。
gooska
反復して書くことで、わからない⇒理解できた⇒当たり前のことのように、どんどん自分の中に積みあがっていくことを感じております。
ひとまずどんなマクロもまずは書いてみるというのが自然とできるようになってきました。引き続きよろしくお願いいたします。
ここがとても勉強になりました。
動画を拝見し、特に勉強になるのはマクロを書いていく道順です。
普通の参考書では答えがばーんとあるだけで、そこにたどり着くまでの道順が難しくてあきらめてしまうということもあるかと思います。
「まずはとりあえず書いてみる」というように簡単なところからとにかく書いてみようと思いました。
Sub mondai6_1()
Dim moto1
Dim moto2
Dim saki
moto1 = 1
moto2 = 2
For saki = 1 To 10
Range("c" & saki).Value = Range("a" & moto1).Value & Range("a" & moto2).Value
moto1 = moto1 + 3
moto2 = moto2 + 3
Next
End Sub
結果は同じですが、変数が多いとメンテナンスもしにくいので、
確かに数列で記述する方がスマートだと思いました。
学生の頃は数学不得意だったので、今回改めて勉強になりました。
この先の講義が楽しみです。
マクロ実行してすぐに気づきましたが・・・
ケアレスミスですが、こういう小さいミスが後々大変になるので、
ハコをきちんと意識したいと思いました。
今回の問題のようなステップで、一旦”しそ巻き無料”のように文字をいれてある程度形にしてからのセルを指定した方が間違いにくいと思いました。
そちらがとても参考になりました。(マウスを使わないなど)
確かにもっと長いマクロを書くときは、この小さな作業の差が後々
大きな差になるので、とても大事だと思いました。
ハナコ、本当に大事ですね。
また演習問題の後に動画も視聴しました。
ハナコのステップは、なんとなくはそのステップでやっていましたが、
しっかりとそのステップを踏むことを意識することで、
頭の中で考えてから記述するより整理できると思いました。
また演習問題の後に動画も視聴しました。
ハナコのステップは、なんとなくはそのステップでやっていましたが、
しっかりとそのステップを踏むことを意識することで、
頭の中で考えてから記述するより整理できると思いました。
今回は「担当区域」を先に考えてやりました。以前に動画を見たときに、確か、migi=2 とか使ってたな、と思って進めていくと、途中で、自分の書き方だとmigi=1でないとうまくいかないと思ったり、あとから「業者名」「フリガナ」を入れたので、『"e" & migi』には1を足さないとダメだな、など、動かしながらやってると、特に意図もなく、1を足してみたり引いてみたりして、結果的に答えにはたどりついています。
例えば、E~G列は、2行目から始まるので、migi=2とするのが通常かなと思います。しかし、意図せず1を足したり引いたりして結果に結び付けばよいのでしょうか?自分が書いたあと、もう一度動画を見ると、自分のはなんだか不格好だなと思います。
初心者のうちは、このような形でもよいのでしょうか?
Sub ren()
Dim hida
Dim tiku
Dim migi
migi = 1
For hida = 2 To 27
If Range("a" & hida).Value <> Range("a" & hida - 1).Value Then
Range("e" & migi + 1) = Range("a" & hida).Value
Range("f" & migi + 1) = Range("b" & hida).Value
tiku = Range("c" & hida) & "地区"
migi = migi + 1
Else
tiku = tiku & "," & Range("c" & hida).Value & "地区"
End If
Range("g" & migi).Value = tiku
Next
End Sub
書いたあとだと、Instr(range(~)など、同じようなものが出てくるし、変数を使った方がすっきりするな、と思うんですが、書いている途中だと変数の使い方がピンときませんでした。
慣れるしかないのかなと思いますが、最初のうちは、以下のように書いてしまってから、あとから、ここはこういう風に変数を使った方がいいな、とか考えていってもいいのでしょうか?よろしくお願いします。
「問題4」シート「Sheet2」で、C列にある住所の「区」または「市」までをF列に、それ以降をG列に書き込むマクロを作れ
Sub ren()
Dim gyo
For gyo = 2 To 11
If InStr(Range("c" & gyo).Value, "区") = 0 Then
Range("f" & gyo).Value = Left(Range("c" & gyo).Value, InStr(Range("c" & gyo).Value, "市"))
Else
Range("f" & gyo).Value = Left(Range("c" & gyo).Value, InStr(Range("c" & gyo).Value, "区"))
End If
Next
End Sub
たとえば、goukei=0 を書かなくても、goukei=0+1 ということになり、結果的には同じことにはなると思いますが。
後半では、goukeiを0にしておかないと一旦クリアにならないので必要だというのは分かりました。
よろしくお願いいたします。
・for next 構文で気をつけることは、データのはじめと終わりに
自分の求める処理がされているか。
・失敗しながら何度もやってみる。
成功者ほどたくさん失敗している!byドラッカー
gyosha = gyosha & ","& Range("A"&gyo).value
のようにすると”A"&gyo の値が","で区切られたリストとなる。
Left関数
Mid関数の復習になったが、いかに自分が理解していないかがわかった。
何度も見直すこと。
文字列を分割するときに、前のスラッシュと後のスラッシュをInstr関数であらわすが今回のポイント
Instr関数で見つけよう”/”を見つける。
行っていないような気がします。それでも、仕事で使うときに、何も見ないで書けるものも出てきているので、とても嬉しいです。
Instr関数の復習になった!
時間を見つけてフォローアップを進めております。
問題[3]について列を移動していく際にどうしようか考えておりましたが
これまでの各動画のコメント欄でoffsetを使用している方がいらっしゃったので利用してみました。
Sub zangyo_syukei2()
Dim gyo '行番号
Dim col_num '列オフセット
Dim target_month '該当月
Dim saikou_name '最高値データの名前
Dim saikou_month '最高値データの月
Dim saikou_zangyo '最高値データの値
Const retsu_start = "C" '開始列
Const retsu_name = "B" '名前列
Const month_gyo = "5" '月タイトル行
'1月から6月まで列を移動しながらデータ走査
For col_num = 0 To 5
'該当月をセット
target_month = Range(retsu_start & month_gyo).Offset(0, col_num).Value
'行方向にデータ走査
For gyo = 6 To 33
If Range(retsu_start & gyo).Offset(0, col_num).Value > saikou_zangyo Then
'最高値データが更新される毎に 名前、月、残業時間を更新
saikou_name = Range(retsu_name & gyo).Value
saikou_month = target_month
saikou_zangyo = Range(retsu_start & gyo).Offset(0, col_num).Value
End If
Next
Next
Range("K4") = saikou_name
Range("L4") = saikou_month
Range("M4") = saikou_zangyo
End Sub
IDの一致は理解できた。
それをIF文で作る
質問です。
シート→VBE
VBE→シート間の移動は、
alt+Tabキー以外で、何かありますか?
else
end if の箱をつくって、それをまた
if then
else
end if の箱に入れると、とても便利で実務で役立てられそうです。
・複数列について調べる際は、列ごとに比べ、条件に合うセルを残していくようにする。
合計は、累計にならないようにループの初めに0をする。
/や半角スペースを ”/”、" "で示すことで文字列を加工することができる。
いやぁ〜でも、変数がたくさん出てくるので、どの変数が何を意味しているのかを理解することが大事。
どんどん書く練習をすすめるぞ!
・データの規則性をみつけたら変数×3−2のように数式で表せるように考え
てみる。←この思考が大切!
・めんどくさくても
・かったるくても
・なにがんでも
"シート名"を書くこと!
・変数を二つ作る
・右のスタートする場所を指定する
・左のリストアップする範囲を指定する
・If文で条件付けをして、条件に合うなら右の表に転記する。
条件にあてはまらないならElseで次のデータを見に行く
・右のリストアップを順番にしていくためには、migi=migi+1!
めちゃくちゃシンプルでいて、かつ確実に動くマクロ!かっこいい!
学びがいがあります。
何度も見て、理解していきます。
どんどんかくぞ!
手打ちする中で理解が深まった。
(同じものはコピペで行い、修正する)
・select case構文 すっきりしていて見栄えもいいね。ぜひマスターしたい!
平成なら+1988する
と和暦を西暦に変更できる。(なるほど)
・男性女性を点数ごとに合否を分けるには
If文の中にIf文を作る。
まずは何かしら動くマクロを求めたいところに書くところからスタート
if 文の練習をした。
めちゃくちゃ時間がかかったけど、声に出して練習することで
for next 構文の形が言えるようになってきた。
まずは、求めたい(答えを返したい)セルに入るマクロを書くところから
スタートだ。
RANK関数とFor ~ Eachを使用して、ベスト4を一覧出力できました。
どうもありがとうございました。
>受講生 さん:
>
>基礎編でもできますけどね。
>
>発展編1の知識でいくなら、 worksheetfunction.rank 関数で各値の順位が分かるので、その値が 1-10 のときはなんたら、とすればオシマイ。
>
>基礎編でいくなら、まずは最大のものを求める。
>次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
>また次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
>...
>という具合です。
>
>
>> 小川先生、お世話になっております。
>> 下のコメント欄の4977で、「発展編1の知識があれば、ベスト10の出力は可能」とのことですが、方針すら思い浮かびません。
>> 何かヒントを頂けると助かります。
>
下のコメント欄の4977で、「発展編1の知識があれば、ベスト10の出力は可能」とのことですが、方針すら思い浮かびません。
何かヒントを頂けると助かります。
for gyo = 4 to 9
以下のgoukei=0が一タブ多かったです。自分で修正しておきます…。
動画は18番まで閲覧致しました。
動画は止めながら一緒にマクロを作っています。
発想が貧困?
なので先に教えてもらって動きを掴む方が早いかなと思い、
フォームを教えてもらうつもりで拝見してから作業というステップにしています。
作業は11まで進めました。
動画時点で「そうなんだ」で全然動きが伴っていないので、
毎日1からやれる範囲まで通しで問題を解き続けています。
問題10までなら5回くらいずつ書いたと思います。
書く度に変化を感じています:
※必ず1行なんでもいいので書く→次に考えるが癖になった
※F8でテストしながら書く→1ステップずつ修正しながら拡大の意味が体得できた
※テストしている時に上手く動かないと感じたら何をしたいのかを紙に書いて、
自分が動かしたいことを文や図に起こすようになった(案外、出来ない時って図示や文にしようとしている自分自身があいまいなんですね)
途中経過でした。
9月半ばまでには25番くらいまでは書けるようになりたいと思います。
以下は一時間くらいかかって完成させた回答です。
まだ残り24個も成長する材料があると思うと、
自分がどこまで行ってしまうのか?楽しみです。
仕事で使えそうな問題も出てきました。引き続き宜しくお願いします。
Sub iwai()
Dim goukei
Dim soukei
Dim gyo
Dim migi
For gyo = 4 To 9
goukei = 0
For migi = 4 To 10
If Range("B" & gyo).Value = Range("I" & migi).Value Then
goukei = goukei + Range("j" & migi).Value
End If
Next
soukei = soukei + goukei
Range("D" & gyo).Value = goukei
Range("E" & gyo).Value = Range("c" & gyo).Value + goukei
Next
Range("D10").Value = soukei
Range("E10").Value = Range("C10") + soukei
End Sub
[2]は○*4-2は出来たのですが、そのあとが思いつかず…
模範解答を見たら「あら~…」でした。
規則性が捉えられなかったので悔しいです。
とりあえず、今日の朝11時頃から始めて、15時頃までかけて、
問1~7まで一通り模範解答通りのマクロが書けました。
繰り返しているとハナコのステップが体に落ちてくる感じがします。
何回も何回も繰り返して淀みなく作業出来るまで持っていきます。
途中経過でした。
select caseのコードを作成しておりました。
Sub renshu()
Dim gyo3
For gyo3 = 2 To 11
Select Case Range("D" & gyo3).Value
Case Is >= 80
Range("E" & gyo3).Value = "A判定です"
Case Is >= 60
Range("E" & gyo3).Value = "B判定です"
Case Is >= 40
Range("E" & gyo3).Value = "C判定です"
Case Else
Range("E" & gyo3).Value = "D判定です"
End Select
Next
End Sub
↑これは自分で何も見ないで作成できるようになりました。
動作も確認済みです。タブの位置も気にしながら作成しています。
以下、変数に纏めてすっきりさせられないかな、
と思って作成してみました。
しかし、値がExcelに入りませんでした。
F8を押すとエラーもなく最後まで動作はしているようです。
Sub renshu_error1()
Dim hani
Dim gyo2
For gyo2 = 2 To 11
hani = Range("E" & gyo2).Value
Select Case Range("D" & gyo2).Value
Case Is >= 80
hani = "A判定です"
Case Is >= 60
hani = "B判定です"
Case Is >= 40
hani = "C判定です"
Case Else
hani = "D判定です"
End Select
Next
End Sub
変数にしないで実行をすれば通常通りに進みます。
Excelのバージョンは2007です。
質問ばかりで恐縮ですが、
以下のように書くと怒られました。
これは、変数gyo2の中身を指定してあげる前に、
gyo2を使用しようとしているから、
という感覚でいればよいでしょうか?
Sub renshu_error2()
Dim hani
Dim gyo2 'Range’メソッドは失敗しました’_Gloval’オブジェクト
hani = Range("E" & gyo2).Value 'gyo2を指定する前にgyo2が出てるから?
For gyo2 = 2 To 11
Select Case Range("D" & gyo2).Value
Case Is >= 80
hani = "A判定です"
Case Is >= 60
hani = "B判定です"
Case Is >= 40
hani = "C判定です"
Case Else
hani = "D判定です"
End Select
Next
End Sub
いずれにせよ、
真似ができるようになったら先へ、先へ進めています。
大切なところは理解できるようになってきましたし、
先生の真似をしながら記載も出来るようになってきました。
感謝しています。
お世話になっております。
今日は時間が殆ど取れずな状態です。
たくさんコメントを書いてしまいましたが、
ご返信ありがとうございました。
一つ一つ、書いて頂いていることがとっても身になります。
自分で手を動かして、考えた結果に対してのフィードバックだからでしょう。
タブの位置まで見て頂けていることに、
とっても感激いたしました。
昨日、どうもハナコのステップの入れ方が曖昧なのかな?
と感じて、動画を数秒刻みで止めながら、
先生の方法を全く同じようにトレースしながら作成する方法を取ってみました。
自分で考えて書くのは勉強になりますが、
先生の作業をトレースする作業も並行していかないと、
もっとも大切な「基本(考え方)」が身に付かず、
我流に陥ってしまいそうです。
せっかく「動画」というツールで勉強させて頂いているので、
「先生の動きがトレースできる」という守破離の守の部分を肝に銘じて取り組みます。
あきらめずに続けます。
また都度扉をたたきます。
[1]書式も付けてみたかったので、自分なりに調べて動くマクロを作りました。
Sub jouken_hantei1()
Dim k
For k = 2 To 11
If Range("c" & k).Value > 100 Then 'c2が100より大きかったら(条件)
With Range("A" & k)
.Value = "○" 'A2を「○」にする(処理)
.Font.Name = "meiryo ui"
.Font.Color = vbBlue
.Font.Size = "15"
End With
Else
With Range("A" & k)
.Value = "×" 'A2を「×」にする(処理)
.Font.Name = "meiryo ui"
.Font.Color = vbRed
.Font.Size = "15"
End With
End If
Next
End Sub
with~はネットで調べました。
似た要領で、元に戻す方法もマクロを作ってみました。
Sub jouken_hantei1_sakujo()
Dim k
For k = 2 To 11
With Range("A" & k)
.Value = ""
.Font.Name = "MS明朝"
.Font.Color = vbBlack
.Font.Size = "10"
End With
Next
End Sub
※元に戻す時に、「標準設定に戻す」って簡単に書けないか?
と感じました。
調べているとありそうですが、きっともっと先のことだろうと考えます。
今は基礎を固める時期かと思いますので、まず課題として与えられていることを吸収しに次に行きたいと思います。
模範解答をちらっと1回見ただけでなんとか出来ました。
気づいたこと:
※問題毎に一つ一つ「はじめから」書いた方が練習になる
→途中、「ん?コピペして数字変えたら問題1→2は一瞬でできるな」って思いましたが、熟す数の方が大切かと思ったので全部呪文を唱えながら一から実施という流れに変えました。
このファイルを1回実施するだけで7つくらいマクロを書けました。
※「何もしない」はElse書かなくてもOK([2])
最初にチャレンジした際は「何もしないけどElse書くのか?」と思って記載したままマクロ書きました。
だけど、あとで「…なくても動くんじゃないか?」と思って試したらElseなくても動きました。
そして、動画を拝見したら省いてよしとのことでした。
多少前後感がありますが、
★問題見て困る→試行錯誤する→通勤時(帰宅時)に動画見る
→先生の解説聞いてあとから全部理解する
→明日、また同じ問題に取り組む
というスパイラルで進めていけそうです。
できれば、事前に次の動画まで見、
「軽く予習をする」を★部分に入れてスパイラル回せるようにしていきます。
※先日頂いたコメントの自分なりの添削、
やりますのでお待ち下さい。
総じて、取り組む前に作戦を考えることと、試行錯誤することが楽しいです。
D列の文字列を3分割にする方法でマクロを書いてみました。
知識の再利用と文字列の切り出しが面白くなってきました。
Sub mondai()
Dim mae
Dim ato
Dim kouzou
Dim kouzoumae
Dim kouzouato
Dim gyou
For gyou = 2 To 51
kouzou = Range("D" & gyou).Value
mae = InStr(kouzou, "/")
kouzoumae = Left(kouzou, mae - 1)
If kouzoumae = "RC" Then
Range("F" & gyou).Value = "鉄筋コンクリート"
Else
Range("F" & gyou).Value = "鉄骨鉄筋コンクリート"
End If
kouzouato = Mid(kouzou, mae + 1)
ato = InStr(kouzouato, "/")
Range("G" & gyou).Value = Left(kouzouato, ato - 1)
Range("H" & gyou).Value = Mid(kouzouato, ato + 1)
Range("I" & gyou).Value = Range("F" & gyou).Value & Range("H" & gyou).Value & "建ての" & Range("G" & gyou).Value & "階部分"
Next gyou
End Sub
動画の見本と異なるのは、1つ下の行と比べて同じか違うかによってわりふる数字を変える点です。
'問題[1]
Sub warifuribangou()
Dim id
Dim gyo
id = 1
For gyo = 4 To 19
Range("B" & gyo).Value = id
If Range("C" & gyo).Value <> Range("C" & gyo + 1).Value Then
id = id + 1
End If
Next gyo
End Sub
'問題[2]
Sub nantoka()
Dim id
Dim gt
Dim gyo
id = 1
gt = 1
For gyo = 4 To 19
Range("B" & gyo).Value = id
Range("C" & gyo).Value = gt
gt = gt + 1
If Range("D" & gyo).Value <> Range("D" & gyo + 1).Value Then
id = id + 1
gt = 1
End If
Next gyo
End Sub
添削と返信ありがとうございました。
(コメント:8489)
インデントも気をつけたいと思います。
問題ありませんでしょうか。
発展編で出てくるDebug.Printでtikuの中身の様子も確認済です。
Sub Createlist01()
Dim hida
Dim migi
Dim tiku
migi = 2
For hida = 2 To 27
If Range("A" & hida - 1).Value <> Range("A" & hida).Value Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
If migi > 2 Then
Range("G" & migi - 1).Value = Mid(tiku, 2)
Debug.Print tiku
tiku = "" '[※]
Debug.Print tiku
End If
migi = migi + 1
End If
tiku = tiku & "," & Range("C" & hida).Value & "地区"
Next
Range("G" & migi - 1).Value = Mid(tiku, 2)
End Sub
現在、エクセルマクロ・VBA基礎編フォローアップ を学習していますが、6月末でキャンペーン終了ということなので、不安すぎて、まだ基礎編フォローアップに苦戦しながらも、先走り発展編1を購入しましたが、いつになれば取り掛かれるのかわかりません。
でも、少しずつでは、ありますが毎日学習を進めていっています。
現在、基礎編フォローアップ動画18の問題2で戸惑っています。
問題1は理解できたのですが、IF文の中のtiku=””の意味が、まったく理解できずに、マクロを書くことができません。
何度も間違っても、うまくいきません。
下記の記載したprogramと回答のプログラムが、違うことによって不都合が生じることになるのでしょうか?
下記に記載したプロフラムはループの後に出力先を記載せずに、IF文後に
記載しています。実行した場合、回答と同じ値が導いていますが、回答のように、ループ後の出力先を記載することが、いいのでしょうか。
記載したprogramのgoukei の場合は、最終のループ後に記載しています。
そのあたりのことについて、わかりませんでしたので、宜しくお願いします。
[code]Sub rensyu1()
Dim goukei
Dim gyo
Dim migi
Dim hida
Dim syoukei
For gyo = 4 To 9
syoukei = 0
For migi = 4 To 10
If Range("I" & migi).Value = Range("B" & gyo).Value Then
syoukei = syoukei + Range("J" & migi).Value
goukei = goukei + Range("J" & migi).Value
End If
Range("D" & gyo).Value = syoukei
Range("E" & gyo).Value = Range("C" & gyo).Value + syoukei
Next
Next
Range("D10").Value = goukei
Range("E10").Value = Range("C10").Value + goukei
End Sub[/code]
Dim goukei
Dim gyo
Dim migi
For migi = 4 To 6
goukei = 0
For gyo = 4 To 18
If Range("C" & gyo).Value = Range("E" & migi) Then
goukei = goukei + 1
End If
Next
Range("F" & migi).Value = goukei
Next
End Sub
お世話になります。
Range("F" & migi).Value = goukei
のプログラムを書くときに、
NextとNextの間に書くことが、
自力で書くときに迷います。
homeshift↓↓↓で選択するとき
最初のForNext構文が完成させたときに、
出力先を書くことで、別物と判断している
みたいで、ワンポイントアドバイス
よろしくおねがいします。
[2]で作ったマクロを改変し、さらに、セルD10、セルE10に各列の合計額を記入するマクロとしなさい についてセルD10 にD4からD9の合計額を表示するというマクロを作る場合にはどのような式で書くことができますか?
[1][2]については以下のようなマクロで問題なく動いたのですが、D列の値をそれぞれの項目について値を入れていくというマクロ(累積値ではなく)になったので、合計のマクロが作れませんでした。Range("D10").value=Sum(”D4:D9”).valueというのも試しましたが、15100という値のみ入りました。アドバイスいただければ幸いです。
Sub test()
Dim harai
For harai = 4 To 9
Dim koumoku
koumoku = Range("B" & harai).Value
Dim iwai
iwai = Range("D" & harai).Value
Dim retsu
For retsu = 4 To 10
If Range("I" & retsu).Value = koumoku Then
iwai = iwai + Range("J" & retsu).Value
End If
Next
Range("D" & harai).Value = iwai
Range("E" & harai).Value = Range("D" & harai).Value + Range("C" & harai).Value
Next
End Sub
[受講方法]
1.動画を見る前に、自力で課題(ドリル)にチャレンジしてみる。
2.動画を見る
3.小川先生のロジックと自分のロジックを比較する。
4.再度、小川先生のロジックでマクロを作成する。
時間は要しますが。上記の4ステップで学習しております
[質問]
一般的にマクロに正解はないと言われますが…
自力で作成したマクロがスマートにできてるかどうかは別として、
マクロの結果が同じであるならば、小川先生の解答と同じでなくても気にする必要ないのでしょうか?
それとも、結果が同じであっても、ロジックの考え方を改めるべきでしょうか?
[質問の意図]
与えられた課題ならば、実際に小川先生のロジックでマクロを組む方が、正解だと考えます。
しかしながら、実際に業務でマクロを自力で作成する場合は、細かく結果を見ながら試行錯誤をして作りあげていくことになり、解答があるわけではありません。(誰かに善し悪しを指導してもらえるわけでもない)
よって、必ずしも、スマートで誰が見ても分かりやすいマクロになるとは限りませんし、結果(ゴール)オーライでマクロを作ることになります。
お世話になります。
マクロの質問ではないのですが、動画10分ころにif文を使って確認する場面がありますが、if文をコピーした後Ctrl+↓ だと、最終行まで選択されてしまうと思うのですが、190行までしかコピペされていません。いったいどうやったのですか。それとも最終行までコピペされたのをなにかショートカットで消しているのですか。細かい質問ですみません。
もしかしたら多くの方から同じような
質問が来ているかもしれませんが、講座の効果的な
復習の仕方を教えて頂きたく存じます。
学んだ内容がすぐに頭から抜けてしまう
事が多いので何かいい方法がございましたら
ご教授頂きたく存じます。
今回の動画の表の見方につきまして
根本的なところを教えて下さい。
右の表から"結婚祝い"の合計金額15,000円を
左の表に転記するのは間違っていないと思うのですが、
次の行の"出産祝い"の合計金額を右の表から取ってくるならば
I列に2回出現するので金額は10,000円になるのではないかと思っています。
そうすると左の表においては
"出産祝い"の行の今月の支払額の値は30,000ではなく
10,000が入ると思うのですが、私が見方を間違えておりますでしょうか?
ご教授頂ければ幸いです。
宜しくお願い致します。
マクロが気を利かせてくれたのでしょうか?これでも不都合はないですか?
Sub miyakojima()
Dim gyo
For gyo = 2 To 22
If InStr(Range("B" & gyo).Value, "都島") Then
Range("J" & gyo).Value = "都島グループです"
End If
Next
End Sub
コメント有難うございます。
「英単語1語の言葉」の選択には、要注意ですね。
「ハンガリアン記法」の動画を見直してみたいと思います。
最大値が複数存在した場合についてのコードを投稿します。
よろしくお願いします。
【課題を以下の通り、設定しています。】
問題[1] 一番得点の高い人が複数いた場合でも抽出可能にする
問題[2] 残業時間が一番多い人が複数いた場合でも抽出可能にする
問題[3] 残業時間が一番多い人が複数いた場合でも抽出可能にする
'**************************************************************
'問題[1] 一番得点の高い人が複数いた場合でも抽出可能にする
'**************************************************************
Sub katinuki()
Dim gyou As Long
Dim kati As Long
'処理1
kati = 2
For gyou = 2 To 11
If Range("G" & kati).Value < Range("G" & gyou).Value Then
kati = gyou
End If
Next gyou
' Range("J" & kati).Value = "最高点です" '←不要かも
'処理2
For gyou = 2 To 11
If Range("G" & kati).Value = Range("G" & gyou).Value Then
Range("J" & gyou).Value = "最高点です"
End If
Next gyou
End Sub
'**************************************************************
'問題[2] 残業時間が一番多い人が複数いた場合でも抽出可能にする
'**************************************************************
Sub kati2()
Dim gyou As Long
Dim Migi As Long
Dim kati As Long
'処理1
kati = 6
Migi = 4
For gyou = 6 To 33
If Range("C" & kati).Value < Range("C" & gyou).Value Then
kati = gyou
End If
Next gyou
' Range("K" & Migi).Value = Range("B" & kati).Value '←不要かも
' Range("L" & Migi).Value = Range("C" & "5").Value '←不要かも
' Range("M" & Migi).Value = Range("C" & kati).Value '←不要かも
'処理2
For gyou = 6 To 33
If Range("C" & kati).Value = Range("C" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("C" & "5").Value
Range("M" & Migi).Value = Range("C" & gyou).Value
Migi = Migi + 1
End If
Next gyou
End Sub
'**************************************************************
'問題[3] 残業時間が一番多い人が複数いた場合でも抽出可能にする
'**************************************************************
Sub kati3()
Dim gyou
Dim Migi As Long '追加
Dim kati
Dim retu
Migi = 4 '追加
retu = "C"
kati = 6
'処理1
For gyou = 6 To 33
If Range(retu & kati).Value < Range("C" & gyou).Value Then
retu = "D"
kati = gyou
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value < Range("D" & gyou).Value Then
retu = "D"
kati = gyou
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value < Range("E" & gyou).Value Then
retu = "E"
kati = gyou
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value < Range("F" & gyou).Value Then
retu = "F"
kati = gyou
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value < Range("G" & gyou).Value Then
retu = "G"
kati = gyou
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value < Range("H" & gyou).Value Then
retu = "H"
kati = gyou
End If
Next gyou
' Range("K" & Migi).Value = Range("B" & kati).Value '←不要かも
' Range("L" & Migi).Value = Range(retu & "5").Value '←不要かも
' Range("M" & Migi).Value = Range(retu & kati).Value '←不要かも
'処理2
For gyou = 6 To 33
If Range(retu & kati).Value = Range("C" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("C" & "5").Value
Range("M" & Migi).Value = Range("C" & gyou).Value
Migi = Migi + 1
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value = Range("D" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("D" & "5").Value
Range("M" & Migi).Value = Range("D" & gyou).Value
Migi = Migi + 1
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value = Range("E" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("E" & "5").Value
Range("M" & Migi).Value = Range("E" & gyou).Value
Migi = Migi + 1
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value = Range("F" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("F" & "5").Value
Range("M" & Migi).Value = Range("F" & gyou).Value
Migi = Migi + 1
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value = Range("G" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("G" & "5").Value
Range("M" & Migi).Value = Range("G" & gyou).Value
Migi = Migi + 1
End If
Next gyou
For gyou = 6 To 33
If Range(retu & kati).Value = Range("H" & gyou).Value Then
Range("K" & Migi).Value = Range("B" & gyou).Value
Range("L" & Migi).Value = Range("H" & "5").Value
Range("M" & Migi).Value = Range("H" & gyou).Value
Migi = Migi + 1
End If
Next gyou
End Sub
フォローアップでは、まず自分でマクロを作ってみてから答えや動画を見ています。
今回、自分で書いたマクロでは数列は使ってなかった(2015年2月5日の匿名さんと、そっくりのマクロでした)のですが、
動画では数列を使っていました。この式で数値がこう変わる、って結果はわかるのですが、自分でこの式を導き出す術がわかりません。
中学レベルの数列すら全く理解していないので、別サイトで数列の勉強からし直そうとしてみたのですが、
等差数列とかますます理解できなくなり絶望的になっています。
こんなことでは便利なマクロが作れるようにはなれそうにもない、と意気消沈。
やっぱり数列を理解できないと、先々発展できないでしょうか?
変数はfor next 構文の外で設定していれば、構文の下のコードには反映されないと勝手に思っていたのですが、
nextの下にコードを書いても、変数リセットの指示を小人ちゃんに出さなければ元に戻らないんですね!
Sub rensyu2()
Dim ban
Dim gyo
Dim cno
ban = 0
cno = 1
For gyo = 4 To 19
If Range("D" & gyo).Value <> Range("D" & gyo - 1).Value Then
ban = ban + 1
cno = 1
Else
cno = cno + 1
End If
Range("B" & gyo).Value = ban
Range("C" & gyo).Value = cno
Next
End Sub
もし、キャンペーン応募が同じ人から複数件あったとして、左の表の同じセルに「、」を打って複数件足していくような場合を想定して下記のようなコードを書きました。
しかし、F5で実行を押すたびに左の票の数が足されていってしまいます。修正箇所としてどの点を直せばよろしいでしょうか。
ご教授宜しくお願い致します。
Sub sakusei()
Dim hida
Dim migi
Dim goukei
For migi = 11 To 23
For hida = 4 To 29
goukei = Range("C" & hida).Value
If Range("E" & migi).Value = Range("A" & hida).Value Then
goukei = goukei & "," & Range("F" & migi).Value
End If
Range("C" & hida) = goukei
Next
Next
End Sub
以下の投稿では、コードのハイライト表示はされません。
お世話になっています。一つ聞きたいことがあります。
下記のように、 Range("D" & hida).Value = goukeiをfor next (migi)の構文内で実行すると、今月支払いのない成人祝いの欄は「空白」で表示されます。
構文外にこの式を置くと「0」と表示されるのですが、構文内に置くとなぜ「空白」になってしまうのでしょうか。
[code]Sub rensyu3()
Dim goukei
Dim migi
Dim hida
For hida = 4 To 9
goukei = 0
For migi = 4 To 10
If Range("I" & migi).Value = Range("B" & hida).Value Then
goukei = goukei + Range("J" & migi).Value
Range("D" & hida).Value = goukei
End If
Next
Next
End Sub[/code
お世話になっております。
単純ですが、シートにある勘定科目毎に伝票を集計し、合計を別シートのP/Lに書き出すマクロです。
1万行以上と金額が億単位だったので、マクロを動かしたら、ものすごくPCのスピードが落ちたので、
何10分まったら終わるのかとおもい途中でやめました。こういう場合はSUMIF関数の方がよいのでしょうか。
ちなみにPCのスペックは問題ありません。宜しくお願いします。
Option Explicit
Sub hoge()
Dim gyo As Long
Dim goukei As Currency
Dim kubun As Long
For kubun = 12 To 226
goukei = 0
For gyo = 2 To 11419
If Worksheets("4月 (2)").Range("C" & kubun).Value = Worksheets("Sheet1 (2)").Range("K" & gyo).Value Then
goukei = goukei + Worksheets("Sheet1 (2)").Range("AE" & gyo).Value
End If
Worksheets("4月 (2)").Range("E" & kubun).Value = goukei
Next
Next
End Sub
先刻 「音声が聞き取れないと」送信しましたが 私の不注意が原因でした。大変お騒がせして申し訳ありませんでした。
Sub nanntoka furi()
Dim gyousha
Dim furi
Dim gyo
For gyo=2 to 11
gyosha=gyosha & "," & Range("A" & gyo). Value
,,,,,,,,
,,,,,,,,,,
End Sub
のなかで、 なぜ gyosha=の次にgyosha & 、、、、 と続くのかわからいのです。gyoshaの変数の定義が上方に書いてあるわけでないし、=の右側に書かれたgyoshaをどう解釈したらよいのでしょうか? 幼稚な質問ですみません。教えてください。お世話になります。
誤ってマクロを動かしてしまって、それをもとに戻すシーンがありますが、ショートカットを使って素早く元に戻しているのは、動画の右上にでてくるキー表示をみてわかりました。
しかし、あまりにも素早くて、マネしようと思っても、押すキーが間違っているのか、動画のようにうまくいきませんでした。
別の動画で解説しているとのことでしたが、見つけられませんでした。
お手数ですが、手順ならびに使っているショートカットキーを教えていただきますか。
わたしもよく間違ったマクロを実行して、失敗することが多いのですが、すぐに修復できれば、非常に助かります。
よろしくお願いいたします。
今月基礎講座始めました 今日は初めて質問させていただきます 宜しくお願いいたします
(3:06)くらいの時ですが それまでのSubは、
Sub kubunnkatu()
Dim ku
Ku=Instr(Range("C2").Value, "区")
Range("F2"). value=Left(Range"C2", Value, Ku)..........
となっていたものを ここでDim jusho とjusho=
Range("C2"). valueを加えていくわけですが、
Sub kubunnkatu()
Dim jusho
Dim ku
jusho=Range("C2"). value
Ku=Instr(Range("C2").Value, "区")
Range("F2"). value=Left(Range"C2", Value, Ku)..........
となるのでしょうか?Dim jusho の位置がDim ku の上に入ることにより Ku-Instra(Range,,,,,の文と引き離されてしまっているように思います。
なにか書き方にルールがあるのでしょうか? こういう微妙なところがわかりません おしえてください
ペンネーム:ぺる
先程の列のループの質問の続きです。
retuを変数にしてとりあえずL列M列 二つの条件を満たした合計がだせました。
2列くらいならいいですが 10列超えると下記では辛いです^^;
もっと簡素な構文もあるかと思いましたが
出来たところまでです。
値は思った通りの数が出ましたが 構文として どうなんでしょうか?
Sub syuukei3()
Dim goukei
Dim retu
Dim hida
Dim migi
For migi = 3 To 9
retu = "L"
goukei = 0
For hida = 3 To 13
If Range("E" & hida).Value = Range("K" & migi).Value And Range("H" & hida).Value = Range("L2").Value Then
goukei = goukei + Range("F" & hida).Value
End If
Range(retu & migi).Value = goukei
Next
Next
For MIGI = 3 To 9
retu = "M"
goukei = 0
For hida = 3 To 13
If Range("E" & hida).Value = Range("K" & migi).Value And Range("H" & hida).Value = Range("M2").Value Then
goukei = goukei + Range("F" & hida).Value
End If
Range(retu & migi).Value = goukei
Next
Next
End Sub
現場では SUMIFS関数を使用する機会が多く
動画のSUMIF関数をマクロで・・を参考にもう一つの条件をANDで追加してみました。
しかし、ANDで指定している”L2”ひとつの時は下記のマクロでOKですが
L2~CX2 まであると どうしていいのかわかりません。
列を行(hida) みたいに 変数にできないでしょうか。Coulmns指定??・・基礎マクロ範囲であれば教えてください。
表(hida)データ表
↓が集計表(migi)となり 品名と各列(F-1.F-2・・)二つの条件が合致するもののみ goukeiする。
K列 L列 M列 N列・・・CX列
1 (1行目空白)
2 品名 F-1 F-2 F-3.・・・
3 AA/1 500
4 AA/2 200
5 BB/1 0
6 CC/1 500
Sub syuukei() ’”品名”AND”L2”の2つの条件を満たしている時だけ goukei する
Dim goukeI
Dim hida
Dim migi
For migi= 3 To 6 ’現場では 30行くらいある
goukei = 0
For hida = 3 To 13
If Range("E" & hida).Value = Range("K" & migi).Value And Range("H" & hida).Value = Range("L2").Value Then
goukei = goukei + Range("F" & hida).Value
End If
Range("L" & migi).Value = goukei
Next
Next
End Sub
SUMIFS関数式を埋め込むと以下になりますが
これもL~CXまで書くのは少しナンセンスかと・・
Sub keisan()
Dim gyo
For gyo = 3 To 6
'実際は50列位あるのでこの書き方は面倒
Range("L" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("M" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("N" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("O" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("P" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("Q" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("R" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("S" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Range("T" & gyo).FormulaR1C1 = "=SUMIFS(C6,C5,RC11,C8,R2C)"
Next
End Sub
まさに今回私が作ったプロセスそのものだったので、こうやって試行錯誤していけば
いいんだな、ということです。
私もまず何かが目標セルに入るところから始まり、少しずつ修正していきました。
午前中あげたものも、どうしてこれならうまくいくのかよくわからないけど
結果をみるとうまくいった!みたいな感じでした。
(つまり、いろいろ分かっておりません(笑))
要求度の高い問題なので、繰り返し挑戦して、覚えていきたいと思いました。
午前中UPしたコードには無駄な行がありましたので、修正を加え、私の完成形は
以下のようになりました。
先生のと少し違うのですが、結果はうまくいっているのでいいのかな(*´∀`*)
A列が重複データでないときは、左のリストは1行下に記述され、
重複データのときは、左のリストは変数kuikiに追加格納されていく
という方法です。
Sub rensyu032904()
'第18問の[2]解答 K列含む
Dim gyo '元データ行位置
Dim gyosya '作成リストの行位置
gyosya = 1
Dim kuiki '区域を格納する変数
For gyo = 2 To 27
If Range("A" & gyo - 1).Value = Range("A" & gyo).Value Then
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
ElseIf Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
gyosya = gyosya + 1
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
End If
Next
End Sub
by gooskaK列は模索中です。考える訓練に、もう少し自分で考えてみます。
明日の大事な要件のため、今日はこれまでにします。
またよろしくお願い致します。
Sub rensyu0328018()
'第18問の[2]解答,I,J列のみ
Dim gyo '元データ行位置
Dim gyosya '作成リストの行位置
gyosya = 2
For gyo = 2 To 27
If gyo = 2 Then
Range("E" & gyosya).Value = Range("A2").Value
Range("F" & gyosya).Value = Range("B2").Value
gyosya = gyosya + 1
ElseIf Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
gyosya = gyosya + 1
End If
Next
End Sub
by gooskaIF構文で最初に分岐処理する方法も覚えたいと思って、
動画をもう一度みたんです。
For gyo = 2 To 11
If gyo = 2 Then
Else
なんとIFの条件分岐には、こういう指定もできるんですね!今まで対象セルでの条件で分岐という使い方しか知らなかったので、
ループの中で「カウントが何回目のときだけは、これをしなさい」
という使い方。これも目からウロコでした。
このヒントから、gyo=2 then 以下を作ろうと思い
動画を止めてやってみたんですが、できませんでした(;´・ω・)
正解に納得。まだまだ理解不十分。
ForNext構文の最初でも最後でもできるようになりたいです!
後半の重複処理については前回の復習でもあるので、一発正解(^▽^)/
メーリングリストのためのcsvですか!
なるほど、使い道はいろいろあるのですね。
by gooska
実務ではcsvをAccessやExcelに取り込んだり吐き出したりしていたので
これができるとなれば実務直結ですから興味津々です。
しそ巻きカウントの応用で、数値加算のところを文字列の追加という形で
できるのかなと最初の道筋はつきましたが、まだまだ理解が浅いらしく、動かしてみると
ラストの2文字列しか残っていなくて、形になるまで結構苦労しました。
ようやくできた!と思ったのが、動画で先生が始めに作られた
「ちょっと惜しい形ですね」と同じもの。つまり、先頭がカンマでした(笑)
なんとかしようといろいろ試したのですが、どうしてもダメで(´;ω;`)ウゥゥ
ギブアップして動画を見にきました。
なんと、ここでMIDやLENを使うとは!?まさに目から鱗状態(+_+)
出だしだけの例外処置として、先頭か末尾を単純操作するわけですね。
変数は初期設定されていない限り、値が代入されるまではempty(0)である
ということを確認させてくれる問題でした。
しそ巻きカウントや条件つき加算の場合なら、初期値が0でも結果に影響することは
ないのですが、今回のように文字列をカンマでつなぐ場合は、数値が代入される前にカンマが
入ってしまうので、empty時の変数の存在をいやでも意識させられます。
今まで気がつかなかった大事な点なので、とても勉強になります。
そして、この出だしの変数empty時の動きが最終的に求めたい結果の例外に
なってしまうことがあるから、出だしだけ条件分岐したり、最後に文字列の加工などを
することが発生すると。今後のために、ここは覚えておこうと思いました。
結論・・・・まだまだです(笑)
by gooska
以下の投稿では、コードのハイライト表示はされません。
やり方が分かれば[1]が解けましたので、
それを動画で確認してから[2]も考えてみました。
なんと動画を見ないで解けました(≧▽≦)
B列とC列で数字の動きは違うけれども、
判別条件はまったく同じなので、まとめてできないかなと。
変数+1を入れる位置がちょっと自信ありませんが
[/code]
Sub rensyu032701()
Dim gyo
Dim BF
Dim CF
BF = 0
CF = 0
For gyo = 4 To 19
If Range("D" & gyo).Value <> Range("d" & gyo - 1).Value Then
BF = BF + 1
CF = 1
Else
CF = CF + 1
End If
Range("B" & gyo).Value = BF
Range("C" & gyo).Value = CF
Next
End Sub
[/code]
by gooska
「資料Aなら1、資料Bなら2、そうでないなら3」
という分岐処理で回した解答を作りました。
資料の名前に規則性がないとか、順番がバラバラだった場合なら
それでよかったかもしれませんね。
しかしデータのボリュームや資料の種類が多かったら、やはり
規則性に注目して書かないと大変なことになります。
ワークシート関数で、リストから重複データを探すために
前後の行を比較する方法を使っている表を見たことがあって、
今回それを思い出しました。
VBAで同じことができるわけですね。なるほど。φ(..)メモメモ
考え方は大体わかったので、模範解答は伏せて
自分でも同じように書けるかどうか試してみます。
by gooska
じっくり小さなステップを積み上げていけばちゃんと解けました。
元データや区切り文字位置をどんどん変数に置き換えていけば、
式も分かりやすくなるし、ミスにも気がつきやすく、すっきりしますよね。
"/"で区切られた中間文字列だけ取り出す方法を基礎編で最初に聞いたときは
うへーなんて複雑なことするんだΣ( ̄ロ ̄lll)ガーン ちゃんと消化できるか自分?と
感じたものですが、似たような問題を繰り返しこなすうち、気がついたら
全然平気になりました。今はむしろそのことに驚いています。Σ( ̄ロ ̄lll)ガーン
なので今回は先生が[2]問をどのようにするのか楽しみでした。
つまり変数というのは、結局値を代入するだけなのですから、
コピペで簡単にできちゃうんですね・・・Σ( ̄ロ ̄lll)ガーン
ただF列のように、分岐処理をする場合の変数の扱いにはまだ慣れていません。
この場合のtekkinは「鉄筋コンクリート」、そうでないときは「鉄骨鉄筋コンクリート」を
代入しなさいと命じて、分岐処理をしても同じ変数を使って1行で済んでしまうという
スマートさあたりが理解不十分みたいです。
私の記憶では、このような変数の使い方はこれで2回目です。
ちゃんと理解して使いこなせたら便利なので、今後の課題にします(^▽^)
by gooska
もともとAccessでそういう仕事をしていたし、得意分野なんです(≧▽≦)
今回は楽勝でした(≧▽≦)
like演算子は、Accessのクエリでよく使いますね。
実はAccessの基本的クエリなら、SQL構文で直接書くことまではできるので、
AccessのVBAも使えるようになれたら・・・というのが中期的目標なんです。
Exce lVBAでもlike使えるのですか?
後日の課題に、楽しみにとっておきます(≧▽≦)
by gooska
復習と理解度の確認になりました。
過去のコメントもできるだけ参考にしています。先輩ユーザーの皆様も、
今回はすいすいとけた方が多かったみたいですね(^▽^)/
最近は苦労して自主補習もしていたので、たまにさくっと行けると自信がついて、
嬉しいです!(≧▽≦)
私はまだ実務で試すことができないので、成果を実感されている方々が羨ましいです。
by gooska
しそ巻きカウント(と私が名づけました)は、
migiとhidaと2種類のカウント変数が同時に動くあたり、
今までの学習だけでは、なかなか理解しにくい部分だと思います。
記憶がとぎれず連日学習している私でもここが難しかったので、
仕事の合間に間隔をあけながら学習される方ならば、
「あれっ急に講座が難しくなった、どうしよう?」
と感じるヤマではないかと・・・(;´・ω・)
私が自分の理解を深めるために思いついた方法、
それは、時計の2つの針です。
長針choは、分刻みの for cho=1 to 60 のカウンタ変数。
短針tanは、時間刻みの、for tan= 1 to 12 のカウンタ変数。
choのカウンタが60になると、
tan=tan+1となって短針が動き、
next → fun=0 となり、
ふたたび長針が0から分を刻んで行くわけです。
こう考えると、短針が動くと同時に長針のカウンタが初期化される動きも
分かりやすくなります。
こういうイメージでF8を動かし、特に変数の入れ替わりや行の移動などを
1行ずつ目で追いながら、マウスオンで確認する作業が大事だなと。
作業レベルでいえば、ハナコの応用として、
集計行(しそ巻き動画のhida行)の、つまり2個目のnextの箱を作ると
同時に、カウンタ初期化(変数=0 の行を、箱の最初に書き加える)、
という作業も連動させて行うと解釈し、覚えてしまって良いのではないかと
思いました。 いかがでしょうか(n*´ω`*n)
by gooska
最大値を求めるときの考え方が勉強になりました。私が浮かんだイメージは、オリンピックなどで
一人ずつ順番に競技を行い、タイムや獲得点数を競うようなケースです。
「これで期待のA選手、暫定1位に躍り出ました!残るはB国の前回メダリストC選手が残るのみです!」
みたいなアナウンスが。・・・そんなイメージで1行ずつ比較していけばいいのだなと。
この考えで単体1列の比較であれば書けそうな予感がします。
列ごとの比較ですが、ついに出てきたという感じです。
見た感じ、難しいです・・・cellを使わないとなると、offsetかな。
どこの参考書にも、rangeの解説後、比較的早くcellの解説があります。
それをあえて先生が基礎編で取り上げなかったことには理由があると踏んでおります。
私が考えた理由とは、カウント変数の指定→箱を作って切り取って中に入れる→
for next文への変数の代入で置き換えというハナコの一連の作業を考えると、
常にrangeを使うならば機械的に代入操作できるため、無駄なミスを回避できるという点です。
一見すると列移動があるときはcellを使うほうが便利そうですが、
代入ルールがrangeと異なるため、一度立ち止まって検証しなくてはならない。
cellの代入ルールを覚えたら覚えたで、rangeと混同してしまうリスクが生じます。
コードを見直す際も、こっちがrange、こっちがcell・・のように頭を切り替えなくてはならず
読みながら考えるのが複雑になりそう。・・・以上です。
どちらにしろ、列比較の連続技を書く能力はまだないので、
自分ならば単体で各列ごとのMAX値を算出し、最後に列ごとのmaxを比較すると思います。
予選勝ち抜きした人が、後日決勝戦に出るというイメージですね(笑)
by gooska
顧客名が混在する日付順の販売データから特定顧客データを抜き出し、別シートにある請求書雛形に転記するという目標です。
Sub rensyhu032602()
'販売データから指定顧客データを抜き出し請求書シートに転記する
Dim gyo
Dim kokyaku
kokyaku = 12
For gyo = 4 To 32
If Worksheets("販売").Range("B" & gyo).Value = Worksheets("請求書雛形").Range("A6").Value Then
Worksheets("請求書雛形").Range("A" & kokyaku).Value = Worksheets("販売").Range("A" & gyo).Value '日付
Worksheets("請求書雛形").Range("B" & kokyaku).Value = Worksheets("販売").Range("C" & gyo).Value '商品
Worksheets("請求書雛形").Range("C" & kokyaku).Value = Worksheets("販売").Range("D" & gyo).Value '単価
Worksheets("請求書雛形").Range("D" & kokyaku).Value = Worksheets("販売").Range("E" & gyo).Value '数量
Worksheets("請求書雛形").Range("E" & kokyaku).Value = Worksheets("販売").Range("F" & gyo).Value '金額
kokyaku = kokyaku + 1
End If
Next
End Sub
変数=変数+1は、 こんな使い方でokでしょうか。販売データから顧客ごとの販売合計にもチェレンジ。
自前のマクロ請求書データと検証して、合計額が一致したときは嬉しくなりました!
数週間前、参考書のサンプルのとおりに独学で作ろうとしたときは、半分以上記録マクロでしたから、
今回一から自分で書けたことにびっくりしました。
実は、1顧客分だけ数字が合わなかったんです。
全部でなく1顧客というのはどうもおかしい。何度も検証を繰り返した結果判明したこと。
同じシートでいろいろな顧客の請求書をテストし、データをクリアせずに実行していたので
行数の多い顧客データが1行、次の顧客データを処理する時上書きされず、残っていたのです。
ワークシート関数ですと必ず範囲指定があるので、こういうミスは起こりませんが、
マクロの場合はきちんと指示しないかぎり、忠実な小人ちゃんは前のデータを消してくれませんから
カウント変数の初期化に限らず、何かの処理を繰り返す際のリセットを忘れてはならないと
学びました。
たくさん失敗から学ばなくてはなりません・・・・(笑)
by gooska
自分でもやってみたのですが・・・結果がどうしても200になってしまうので原因を探していたら
sokei=sokei+Range("D"&hidari).value
とするべきところを、
sokei=gokei+Range("D"&hidari).value
としていました(笑)
gokei は1項目の集計が終わったらリセットされるから、
これだと最終項目お見舞い袋の集計結果100に、もう一度gokeiを足しただけですね。
まだまだでした(笑)
by gooska
いったん動画を止めて、問題に取り組みましたが、・・・
最初思うようにできませんでした。
変数の値が加算されず、常に最新値のみが表示されてしまったり(笑)
しそ巻き無料の動画を見直し、もう一度理解してから再挑戦すると、
カウントを加算に変更するだけなので、今度はうまくいきました。
ただしC,D,E列それぞれの単体マクロしか書けませんが(笑)
ポイントは3つですね。
1変数=変数+指定セルの値 という式の理解
2計算が終わった変数をワークシートに吐き出す式をどこに入れるか
3カウンタの初期化をどこにいれるか
自分はまだまだですが、やはりF8を押して1行ずつマクロを動かし、
変数の値がどのように変わっていくかと、NEXTやEND IFの後、
どの行に戻るのかをきちんと確認していく作業が大事だと感じました。
マウスオンで、変数の値が確認できるのは素晴らしいです!
最近キーボードだけでそれができたらいいのになと思います、
ようやくキーボード操作でVBEウィンドウとワークシートの切り替えが
できるようになったので。
by gooska
動画と比べてみると、無駄が多いです(;´・ω・)
Sub mondai0093()
Dim namae
Dim sei
Dim gyo
For gyo = 2 To 11
namae = Range("B" & gyo).Value
If InStr(namae, "/") > 0 Then
sei = InStr(namae, "/")
Range("C" & gyo).Value = Left(namae, sei - 1)
Range("D" & gyo).Value = Mid(namae, sei + 1)
Else
sei = InStr(namae, " ")
Range("C" & gyo).Value = Left(namae, sei - 1)
Range("D" & gyo).Value = Mid(namae, sei + 1)
End If
Next
End Sub
"/"で区切る場合と、半角スペースで区切る場合を
分岐処理で繰り返してしまいました。
sla = InStr(myonam, " ")
If sla = 0 Then
sla = InStr(myonam, "/")
End If
のように、変数に 「または」の 意味をもたせてIF文を閉じてしまい、共通の文字列関数処理として書いてもよかったんですね。
練習が必要です。考える方向はざっくり合っていたと思いますが・・・
by gooska
わかりやすいたとえ話をありがとうございます。
現実にカウンターで計測する時のことを考えると、直前に初期化するのが自然ですね。
私がnextの前に初期化を入れてみたのは、nextが入れ子になっているとステップが複雑なので、
どこで初期化されるのか慣れない私には まだ分かりにくかったからです。
集計表に書き込んだ直後であれば、カウンタ変数の役目はいったん終わるわけですから、そこで0にしてしまおうかと。
メリットは、初心者にわかりやすい場所かなと思えたことです。
通常の、新しいカウントを始める直前での初期化、メリットは通常のFORNEXT構文での位置と同じなので、
時間が経って自分で振り返ったり他人が見た場合、理解しにくい。
同様に、next前の初期化はたぶんあまり他の人がそう書かないので、わかりにくい。
自分が今思いつけるメリッ・トデメリットはこのくらいしかありません。
もっとForNextの経験を積んだら思いつくかも。
by gooska
一言紹介がありました。
文字位置だけでなく、文字列のあるなしの判別で分岐処理をするという点が印象に残っていたらしく
それを思い出して解くことができていました。(*^▽^*)
ただ、instrで返された数値を変数にし忘れたので、あまりスマートなコードではありませんでした。
東京モノレール、どんなふうに処理したのか楽しみに見ました。
1か所だけの例外値だったので、私も単純な処理をしてしまいました。
instrを変数にしていなかったので、こんな風です:(笑)
IF文で例外処理を分岐するロジックは理解できたと思います。
If Left(rosen, 7) = "東京モノレール" Then
Range("H" & gyo).Value = Left(rosen, 7)
Range("I" & gyo).Value = Mid(rosen, 7 + 1)
Else
by gooska全問解いてから動画を見ています。1,2は、先生と同じような形で書けました。
今回のような使い方をするleft、MID、instr操作はマスターできたと思います。
後半部分、次の動画で先生の回答と比較したいと思います。
by gooska
動画を見てから、数列を使ったやり方に挑戦しました。
数列を見たときは分からなかったのですが、ちゃんと該当行を書きだして考えれば
データは3行サイクルなので、3の倍数行に対し、それぞれの剰余が0,1,2になることがわかります。
3のn倍のnが、データを書き出すC列の行番号と連動するので、変数も1つでいいわけですね。
それをもとにあてはめれば、動画の方式でうまくいくことも理解できました。
前半が理解できたので、後半は悩まずに解けました。
さて昨晩のコードですが、
データの規則性として必ず「第」が先頭に来るのであれば問題ないと思いますが、
2問目のようにスペシャルが混ざった場合には対応できませんね・・・
空白行があっても今回のように行数に規則性があるならば、数列の考えで取り出す方が良いと
納得しました。
逆に空白が不規則であるならば、IF文を使うほうが良いのかなと。
2問目について。データがいくつあるのか空白行のためにパッと見てわかりにくいとき
forでいくつを指定したらいいのかと考えました。
実は最初、多めの200まで指定して、行を超えても空白行どうしになるから大丈夫かなと思ったんですが、
今回のように間にハイフンをつけなくてはいけない場合、ハイフンだけの行が発生してしまいます。
次にif range(”A”& bango)<>"" then のようなIF文をつけたらどうかと思ったのですが、
これをやるとカウント変数がうまく作動せず、C列の書き出しに空白行が出たり、抜き出さずに飛ばされるデータが出たりして
うまくいきませんでした。(;´・ω・)
なので再アップします。どこかに掲載済でしたらすみません。)
今回数式の話が出たところで動画をとめて、自分だったらどうするか考えて以下を書きました。
文系の発想ですみません。コメントいただけましたら幸いです。
これから数列の勉強をしに動画を見てきます。
Sub mondai006()
Dim moto
Dim syukei
syukei = 1
For moto = 1 To 28
If Left(Range("A" & moto).Value, 1) = "第" Then
Range("C" & syukei).Value = Range("A" & moto).Value & Range("A" & moto + 1).Value
syukei = syukei + 1
End If
Next
End Sub
by gooskaワークシートの指定部分だけを教わったら、あとは自力で解けました(*´▽`*)
教わったそばからIF文の条件式にワークシート指定を忘れて、最初動きませんでしたが(笑)
あるあるなので、シートの特定があるマクロは、気をつけたいと思います。
反復効果がすばらしいです。
gooska
だんだん慣れてきました。パターンを完全に覚えるまで、とにかく繰り返せばいいのですね。
慣れていく過程で、おぼろげだった理屈の理解も、意外と早くついてくるような気がします。
高校時代にこういう勉強の仕方をしていたらなぁ・・・と残念です(笑)
まだまだですが、練習あるのみ gooska
変数が2つあり、入れ子もあると難しいですね。変数の指定を逆にしてしまったりと、何度もやり直しました。
身体で覚えるまで丸暗記のつもりで、、、ということなので、繰り返し練習しますね。
変数=変数+1と、初期値の設定は繰り返すうちに分かってきました。
gooska
書いても問題ないでしょうか。一応試してみたら同じ数値は得られましたが。
Range("F" & syurui).Value = gokei
gokei = 0
Next
gooskaForNextが入れ子になる複数のカウントはもう少し練習します。
やはりカウントを初期化する=0の式をどこで入れるかですよね。
カウント数を記述する行と、初期化の行が大事ですね。
gooska
COUNTIF関数を使い慣れているせいか、今回のマクロは難しく感じました。
次の処理のためにカウント変数を0に戻さないといけないことはよくわかりましたが、
初期化する位置があの行だということが、現段階で理解できていません。
たぶん今このエラーを修正せよと言われたら対処できないと思います。
まず慣れが必要かと思うので、練習してみます。
gooska
「home、shiftを押しながら↓↓↓、tabでずらして切り取って」は、ゴロもいいので耳に残りやすく助かっています。
基本に忠実に、飽きが来るまで繰り返そうと思います。
ELSEIFは、IFやSelectcaseに比べてコピペ操作が間違いやすいです。
コピペしてから字下げ忘れに気がついたり・・・・。
elseと打ってからのIFフレーズコピーをマスターしたいと思います。
gooska
毎回、この欄の過去のコメントも読んで参考にしています。
玉谷さんの別解、ちょっと考えて理解できました。(瞬時には分かりませんでした)
男女別とはいえ比較パターンは同じだから、条件式はそのままにして、
70点以上と80点以上の数値を変数にしたのですね。
今後基準点が変更される可能性があるなら、変数にするメリットがあると思いました。
将来人が作ったマクロを修正するような業務を想定するなら、自分でもある程度書けるだけでなく、
他人が作ったマクロを読む能力も必要だと感じました。
まだ私はこんなマクロは書けないので、まずは足元を固める訓練に専念します。
gooska
今回の動画を初めて見たときはちんぷんかんぷんで
ちょっとパニックになりました。(汗)
2度目でなんとなく・・・ですが、意味がわかりました。
何度も動画を確認してさらに理解を深めようと思います!
変数もいろんな使い方があるんだとびっくりでした。
しかし、なぜ出来ているのか、説明もできないです。イマイチ理解度が低いような気がします。
[2]に関しては、こんな感じです。若干小川先生の書いたものと違う(if文が一つだけ)のですが、これでいいのでしょうか?
Sub test2()
Dim migi
Dim hida
Dim ku
migi = 1
For hida = 2 To 27
If Range("A" & hida - 1).Value < Range("A" & hida).Value Then
migi = migi + 1
Range("E" & migi) = Range("A" & hida).Value
Range("F" & migi) = Range("B" & hida).Value
ku = ""
End If
ku = ku & "," & Range("C" & hida).Value & "地区"
Range("G" & migi).Value = Mid(ku, 2)
Next
End Sub
仕事で必要で、少し複雑なMID関数をマクロで強引に当てはめてみました。なんだかできちゃいましたが・・
わかっていることは、①全部で16文字 ②11文字目がいつも丁 ③最初の1文字と最後の3文字は必要ない
④”-”の前は AかBかC
C列の文字を以下条件でG列に抜き出す
例)”東京都渋谷A代々木4丁目5番地よ” を ”京都渋谷A-代々木45” としたい。
2文字目から5文字取り出し”-”を入れる&7文字目から4文字取り出し&2文字飛ばして&13文字目の1文字を取り出す。
これを1つの文字として 別台帳に転記する。
今回は規則性なし(この場合の規則性が当てはまるのかもわからなかったので・・^:^;)
単純に関数の式を当てはめました。
Sub MMM()
Dim NAMAE
Dim GYO
For GYO = 2 To 51
NAMAE = Range("C" & GYO).Value
Range("G" & GYO).Value = MID(NAMAE, 2, 5) & "-" & MID(NAMAE, 7, 4) & MID(NAMAE, 13, 1)
Next
End Sub
できちゃったからいいのか?とも思いましたが
他に良い方法があれば教えてください。
コードを書き、動作確認もできました。
タイトルにある「1行のリストを解析して表にする」もやってみました。こちらの方が、断然楽でした(「地区」を消す際に、Replace関数を使用しました)。
現在、仕事でデータベースを作成しているのですがキーワード抽出機能を作成するのに
ネットで調べてlike演算子を用いるも全く機能せず、かつどの情報も複雑で分かりづらく困り果てていたところに、
ふとこの講義の事を思い出し無事にものの数分で解決しました。ありがとうございます。
小川先生のコードに勝るものはありませんね。あらためて、めちゃ凄いって思いました。
B18のセルに自由にキーワードを入力し、長文からの抽出もばっちり上手くいきました。
Sub miyakojima2()
Dim n
Dim i
Dim k
i = 2
k = Range("B18")
For n = 2 To Range("A65536").End(xlUp).Row
If InStr(Range("B" & n).Value, k) > 0 Then
Range("A" & n & ":G" & n).Copy Range("J" & i & ":P" & i)
i = i + 1
End If
Next
End Sub
Sub kekkoniwaigoukei()
Dim soukei
Dim goukei
Dim migi
Dim hida
For hida = 4 To 9
goukei = 0
For migi = 4 To 10
If Range("I" & migi).Value = Range("B" & hida).Value Then
goukei = goukei + Range("J" & migi).Value
End If
Next
soukei = soukei + goukei 'ここを修正
Range("D" & hida).Value = goukei
Range("E" & hida).Value = Range("C" & hida).Value + goukei
Next
Range("D10").Value = soukei
Range("E10").Value = Range("C10").Value + soukei
End Sub
タイピングについて質問させてください。文字のタイピングはだいぶ早くなったのですが、ショートカットキーの手の動かし方が遅くいつも間違ってしまいます。
キーボードにもよると思いますが、先生はPgUp、PgDnが右上にある場合は小指で打っていますか?またそのほかCtrl/やシフト、Altを押すときも、どの指で押せばいいかいつも迷ってしまいます。
アドバイスありましたらお願いいたします。
本日で基礎講座閲覧期間が終了します。この4か月間、実際実務でも使用しました。まだ慣れていないため、マクロを作るのに時間がかかってしまった状況でしたが、この講座を受講したおかげで、マクロだけでなく、すべての仕事面で、効率的にしごとができたと思います。また、質問のご返答の中で、自分の弱点を指摘してもらうなんてことは、職場の同僚からはなかなか言ってもらえるような年齢でもなくなってきているため、非常に貴重でした。%365も毎日楽しみにしています。
ありがとうございました。
最後に質問です。これから特打ちを購入しようと思います。自宅のキーボードと職場のキーボードが違うのですが、練習するなら職場と同じキーボードで練習しようと思います。好きにしろといわれそうですが、どう思われますか。
1.動画を見る前に問題を自分で考えてから解いてみて、動画をみる。
2.動画を見てから自分で同じように書いて練習する。
私は、1でやるとまったく想像力がないので。。手が止まってしまいやる気を失ってしまいます。
2の方法でも上達するでしょうか。それともおすすめはやはり1の方法でしょうか。
個人個人で最適な勉強方法は違うと思いますが。。先生のご意見を教えていただけましたら幸いです。
あと、数学や算数がまったく得意でないのですが。。それにマクロの取得は関係ありますか?
得意不得意関係なくある程度のところまではマクロは書けるようになりますか。
動画のおかげで確実に上達しているとは思うのですが、不安な気持ちです。励ましてください!
どうぞよろしくお願いいたします。
ループの中に入れるメリットがないことがよくわかりました!
ありがとうございます。
どこに書いても同じかと思ったのですが、ハナコでくくる位置は一番外側ではなくて、内側のほうがいいのでしょうか。
Sub rensyu1()
Dim gyo
For gyo = 2 To 50
Dim jyusyo
jyusyo = Range("C" & gyo).Value
Dim ku
ku = InStr(jyusyo, "区")
Range("F" & gyo).Value = Left(jyusyo, ku)
Range("G" & gyo).Value = Mid(jyusyo, ku + 1)
Next
End Sub
お世話になっております。
閲覧期間残り一月のところで、基礎編およびフォローアップ編を、閲覧、勉強しおえました。(使えるようになったかは別として)
覚えたマクロで、自分の業務でも使い始めました。ただ、マクロを完成させるのに時間がかかって、今の時点では、これまでちまちまやっていた時間と
さほど変わらない状況です。そのため、マクロを考えるのは、自宅でやっています。ただ完成したマクロを何度も実行してニヤニヤしています。
そんな状況ですが、現在、壁にぶち当たっている問題があります。
それは、野菜の品種名と出荷日のリストがあって、それを、縦に品種、横が出荷日の表に、その品種の出荷日ごとの出荷点数をうちだすというもの
ですが、知恵が浮かびません。
野菜は20種類ほどあって元のリストは重複しておりますし、合計300点あります。出荷日は20日間あります。
重複しない野菜のリストは、教えていただいたマクロでできました。また、品種別の出荷点数も、ネットでみつけたマクロでとってくることができました。
しかし、品種別、さらに出荷日別の点数を打ち出すマクロができません。
以前、どなたかの質問で、その内容は発展編で学んでほしいという回答を見ましたので、今回の質問が基礎編を超えるようなら、仕方ありませんが
基礎編レベルで解決できることでしたら、教えてください。
よろしくお願いいたします。
この動画の5:50のあたりで、Ctrl+Hで置換する場面がありますが、そのあたりの手順を詳しく教えていただけますか。
少しでも楽する方法を覚えたいものですから。
よろしくお願いいたします。
お世話になります。
この動画の最後のところで、Range("F" & gyo).Valueを 変数のtekkinにおきかえる場面がありますが、そこがにわかに理解しがたいです。
変数のtekkinは、マクロを見る限り、 "鉄筋コンクリート" または "鉄筋鉄骨コンクリート" としか私には読めないからです。
たしかにこれでも動きましたが、考え方や読み方のポイントを教えていただけますでしょうか。
”結婚祝い”しか反映されていないですよね?まぁ、やり方はわかるので、イイっちゃいいのですが・・・
早速質問なのですが、小川先生のコーディングのやり方を真似して実際に打ってみましたが、
動画の結果より全体的に数が5000少なくなってしまいます。この場合どうすればいいでしょうか?
こういうパターンは利用頻度が多そうなので、動画を見ないでもすらすら書けるよう、頑張って覚えたいと思います。
書き出すタイミングが動画と違ったので、For Next構文の始まった直後と終わった後に特別な仕掛けをつくる仕組みがなくてもテストしてたら思い通りに動いていました。
今回はうまくいったけれど、初回処理と最後の処理を気をつけるというのは よく出てきそうなので、しっかり覚えようと思います!
Sub seikei()
Dim hida
Dim migi
Dim tiku
migi = 2
For hida = 2 To 27
If Range("A" & hida).Value <> Range("A" & hida - 1).Value Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
migi = migi + 1
tiku = ""
End If
tiku = tiku & "," & Range("C" & hida).Value & "地区"
Range("G" & migi - 1).Value = Mid(tiku, 2)
Next
End Sub
Sub sisomaki()
Dim siso
Dim nomi
Dim kanpyo
Dim gyo
For gyo = 4 To 33
If Range("C" & gyo).Value = "しそ巻き無料" Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
nomi = nomi + 1
ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
kanpyo = kanpyo + 1
End If
Next
Range("F4").Value = siso
Range("F5").Value = nomi
Range("F6").Value = kanpyo
End Sub
ちなみに、裏技的な解法で解いてみましたが、回答と比べるとシンプルではないですね。
Sub moji()
Dim gyo
Dim migi
migi = 1
For gyo = 1 To 29 Step 3
Range("C" & migi).Value = Range("A" & gyo).Value & Range("A" & gyo + 1).Value
migi = migi + 1
Next
End Sub
やっぱり解答のマクロはシンプルでかっこいいですね。
わたしは、、、毎回書き出してしまいました。。。
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
問題2のほうは いっぱい 変数使ったりしていました。
解答のマクロを見て 思わず「きれい!」と言いました。
こんなにシンプルに物事をさっと理解できるようになりたいなぁ。
感性を磨いていきたいと思いました。頑張ります!
応用力が足りませんね。。。
回答の動画をみて あんなにあっさりできるなんて びっくりでした。
Sub rensyu2()
Dim count1
Dim count2
Dim count3
Dim gyo
For gyo = 4 To 33
If (InStr(Range("C" & gyo).Value, "しそ巻き無料")) > 0 Then
count1 = count1 + 1
ElseIf (InStr(Range("C" & gyo).Value, "飲みもの無料")) > 0 Then
count2 = count2 + 1
ElseIf (InStr(Range("C" & gyo).Value, "かんぴょう巻き無料")) > 0 Then
count3 = count3 + 1
Else
End If
Next
Range("F4").Value = count1
Range("F5").Value = count2
Range("F6").Value = count3
End Sub
フォローアップセミナーのNO.018の最終問題_ 2は5時間ぐらいあれこれと悩みました。
基礎編についてはほぼ理解できたと思います。
次のステップの順序としては、どの講座を受けるのが理想でしょうか?
G列に書き出すタイミングが上手く表現できず悩みました。
以下が出来上がったプログラムソースです。
code
Sub list2()
Dim memo, migi, gyo
migi = 2
For gyo = 2 To 27
If Range("a" & gyo).Value <> Range("a" & gyo - 1).Value Then
Range("e" & migi).Value = Range("a" & gyo).Value
Range("f" & migi).Value = Range("b" & gyo).Value
Range("g" & migi - 1).Value = memo & "地区"
memo = Range("c" & gyo).Value
migi = migi + 1
Else
memo = memo & "地区" & "、" & Range("c" & gyo).Value
End If
Next
Range("g" & migi - 1).Value = memo & "地区"
End Sub
/code
migi=migi+1でないといけないのでしょうか?覚えたらよいのでしょうが、あの場所にこの入力は発想がつかず、応用が利かないのではないか心配です。
下記でも行けるのではないかと思いやってみたら、最初の1行の部分だけが繰り返されてうまくゆきませんでした。
Sub koriha()
Dim hidari
Dim migi
For hidari = 8 To 17
For migi = 5 To 14
If Range("c"&hidari).Value > 100 Then
Range("f" & migi).Value = Range("a" & hidari).Value
Range("g" & migi).Value = Range("b" & hidari).Value
Range("h" & migi).Value = Range("c" & hidari).Value
End If
Next
Next
End Sub
基礎編フォローアップ講座を拝聴していますが、2回から音声が非常に小さくて
聞き取りにくい状態です。
Safariで再生しています。
ボリームを最大にしていますが、他にも音を大きくする方法があったら教えてください。
この講座で学んだ事を駆使して作成しましたが、F8では正常なのにF5実行をするとデータがうまく転記されません。
何が原因でしょう?
一応上手く処理されましたが、
どこかおかしいところや注意すべき箇所はありますでしょうか?
Sub test()
Dim cGyo As Long
Dim cHida As Long
Dim cMigi As Long
Dim sTiku As String
cHida = 2
cMigi = 2
For cGyo = 2 To 27
If Range("A" & cGyo).Value <> Range("A" & cGyo + 1).Value Then
Range("E" & cHida) = Range("A" & cGyo).Value
Range("F" & cHida) = Range("B" & cGyo).Value
Range("G" & cMigi) = Mid(sTiku & "," & Range("C" & cGyo).Value & "地区", 2)
cHida = cHida + 1
cMigi = cMigi + 1
sTiku = ""
Else
sTiku = sTiku & "," & Range("C" & cGyo).Value & "地区"
End If
Next
End Sub
1、sub Kazoeru プログラム上から9行目”結婚祝い”のままです。
2、一度リセットするプログラムがありません。
画像は依然より良くなっています。頑張ってください。
最初のカンマを消す方法はいくつかの組み合わせで十分に出来るのですね…。
ありがとうございます。
それでも書くのに悩んだ12回と18回は、また復習しますヽ(*´v`*)ノ
次は「Web連携」をやりつつ毎日一つはマクロを書いていきます^^/
「Web連携」が終わった後は、マクロの苦手な部分も克服できていることに期待。
それから発展編1に移ろうと思います^^
今回書いたコード↓
Sub create_ward()
'review: 2015/2/16
Dim i, mke, ward
mke = 2
For i = 2 To 27
If Range("A" & i - 1).Value <> Range("A" & i).Value Then
Range("E" & mke).Value = Range("A" & i).Value
Range("F" & mke).Value = Range("B" & i).Value
ward = Range("C" & i).Value & "地区,"
mke = mke + 1
Else
ward = ward & Range("C" & i).Value & "地区,"
End If
Range("G" & mke - 1).Value = Left(ward, Len(ward) - 1)
Next
End Sub
組み合わせと発想で、簡単にできますね。この動画で、ハナコのステップの復習にもなりました。
何回も聞いていますと、現在の仕事の中でも「箱を作る…中に入れる…加工する…」が頭の中で繰り返されています。
1000件くらいのデータの割り付けも簡単に出来たので、とてもうれしいです。
Sub list2()
Dim gyo
Dim migi
Dim kuiki
migi = 2
For gyo = 2 To 27
If Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
Range("E" & migi).Value = Range("A" & gyo).Value
Range("F" & migi).Value = Range("B" & gyo).Value
migi = migi + 1
End If
If Range("B" & gyo - 1).Value <> Range("B" & gyo).Value Then
kuiki = Range("C" & gyo).Value & "地区"
Else
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
End If
Range("G" & migi - 1).Value = kuiki 'G列が1行ずれてしまったので、migi -1で調整した。
Next
End Sub
急遽、migi-1なんてやらかしていますが…(^_^;)それでも、何とか一通りフォローアップ動画も観終わりました。
もう一度、最後の方の難しかったところを観てから、次の「発展編1」に進もうと思います。
ありがとうございます。
ここで、MId関数を使うことは思い付きませんでした。
Range("F2").Value = Mid(gyosya, 2)
Range("F3").Value = Mid(kana, 2)
「マクロを学ぶと言うことは、『視野を広げて考えること』でもあるのだな」
と実感しました。
毎回、勉強になります。
ありがとうございます(^o^)
Sub bangou()
Dim gyo
Dim Asiryo
Dim Bsiryo
Dim Csiryo
Asiryo = 0
Bsiryo = 0
Csiryo = 0
For gyo = 4 To 19
If Range("D" & gyo).Value = "資料A" Then
Range("B" & gyo).Value = 1
Asiryo = Asiryo + 1
Range("C" & gyo).Value = Asiryo
ElseIf Range("D" & gyo).Value = "資料B" Then
Range("B" & gyo).Value = 2
Bsiryo = Bsiryo + 1
Range("C" & gyo).Value = Bsiryo
Else
Range("D" & gyo).Value = "資料C" Then
Range("B" & gyo).Value = 3
Csiryo = Csiryo + 1
Range("C" & gyo).Value = Csiryo
End If
Next
End Sub
IF文の条件を「<>」にすることは、思い付きませんでした。
If Range("D" & gyo - 1).Value <> Range("D" & gyo).Value Then
「If○○ = ×× Then」だけでなく、「<>(等しくなかったら)」という使い方もできるのだなと、解説を観て思いました。「等しければ」の反対は「等しくなければ」だから、「=」の条件でIF文を作るのが難しい、あるいはややこしくなるようなら、
「<>」の条件を考えて、作ってみるという方法があるのだなと思いました。
Cellsを思い出したので、RangeとCellsのいいとこどりで書いてみましたヾ(*´∀`*)ノ。
(個人的にはRangeの方がセル特定しやすくて好きです)
「1月の最長労働者とその他の月の労働者との勝ち抜き」という発想で書きました。
Sub overwork_total_1()
'review [3]: 2015/2/11
Dim l, c, lng
lng = 6
For l = 6 To 33
If Range("C" & lng) < Range("C" & l) Then
lng = l
End If
Next
Range("K4").Value = Range("B" & lng).Value
Range("L4").Value = Range("C5").Value
Range("M4").Value = Range("C" & lng).Value
l = 0
For c = 4 To 8
For l = 6 To 33
If Range("M4").Value < Cells(l, c).Value Then
Range("K4").Value = Range("B" & l).Value
Range("L4").Value = Cells(5, c).Value
Range("M4").Value = Cells(l, c).Value
End If
Next
Next
End Sub
今から仕事なので帰宅したら小川先生のマクロを検証しつつなぞろうと思います。
Sub createlist2()
Dim i, j, ward
Range("E2").Value = Range("A2").Value
Range("F2").Value = Range("B2").Value
j = 3
For i = 3 To 26
If Range("A" & i - 1).Value <> Range("A" & i).Value Then
Range("E" & j).Value = Range("A" & i).Value
Range("F" & j).Value = Range("B" & i).Value
j = j + 1
End If
Next
'作成日: 2015/02/09。↓2日考えてやっと完成
j = 2
Range("G2").Value = Range("C2").Value & "地区"
For i = 2 To 26
If Range("A" & i) <> Range("A" & i + 1) Then
ward = 0
j = j + 1
ward = Range("C" & i + 1).Value & "地区,"
Range("G" & j).Value = ward
Else
ward = ward & Range("C" & i + 1) & "地区,"
Range("G" & j).Value = ward
End If
Next
For i = 3 To 11
Range("G" & i).Value = Left(Range("G" & i).Value, Len(Range("G" & i).Value) - 1)
Next
End Sub
解説動画を何度か繰り返し観たり、正解のコードを眺めながら、構造を理解していきたいです。
最後にコンマがくるのはどうしたものかな... と考えてそれを解決したのが以下のコードです。
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関数は思いつきませんでした。
最初に自力でやった時は、For~Next構文を1回しか使わずにやりました。
Sub count2()
Dim siso
Dim drink
Dim kanpyo
Dim gyo
For gyo = 4 To 33
If Range("C" & gyo).Value = Range("E4").Value Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "Range("E5").Value Then
drink = drink + 1
ElseIf Range("C" & gyo).Value = Range("E6").Value Then
kanpyo = kanpyo + 1
End If
Range("F4").Value = siso
Range("F5").Value = drink
Range("F6").Value = kanpyo
Next
End Sub
最初に解説動画を拝見した時は、
「For~Next構文の中に、さらにFor~Next構文が入ると言うことだろか?」
と考えました。
そこで、migiとgyoの値に注目しながら、紙に書いてみて確認しました。
最初は、migi=4、gyo=4からスタートし、gyoの1回目のループが終わった地点では、migi= 4、gyo= 33で、
次にRange("F" & migi).Value = goukeiをした後、migi=5となり、migiの1回目のループが終わり、
2回目のループは、migi=5、gyo=4から始まるのだと確認しました。
何だか、すごく手間のかかることをしていますね(^_^;)
最初に自分だけでやってみた時は、数列を使わずに解きました。
End Sub
Sub list()
Dim title
Dim gyo
title = 1
For gyo = 1 To 10
Range("C" & gyo).Value = Range("A" & title).Value & Range("A" & title + 1).Value
title = title + 3
Next
End Sub
やはり、文系的な発想ですね…。
数列を使った方が、同じ動きをするプログラムでも、行数が少なく、スッキリしたものができますね。
勉強になりました。
ありがとうございます。
18回目まで行ったら、第9回からもう一度復習します^^
3回くらい書いてみるとなんとなく、形が見えてきました。
変数は、使用する数と場所を要注意だと解りました。
このバランスで、いろんな事もシンプルに考えることができました。
今回の動画はとても参考になりました☆└(゚∀゚└))((┘゚∀゚)┘
本ばっかり読んでやっていた時は、その内容が唯一の答えのように感じてしまいますね。
何事も自分で試していくことが大事ですね。
”いくつかサンプルを試してみる”が団子の中味を決める大切なステップだと感じました☆
ありがとうございました。
Sub risuto()
Dim hidari
Dim migi
Dim tantou
migi = 1
For hidari = 2 To 27
If Range("A" & hidari - 1).Value <> Range("A" & hidari).Value Then
migi = migi + 1
tantou = " "
End If
Range("E" & migi).Value = Range("A" & hidari).Value
Range("F" & migi).Value = Range("B" & hidari).Value
tantou = tantou & "." & Range("C" & hidari).Value & "担当"
Range("G" & migi).Value = Mid(tantou, 2)(A)
Next
End Sub
自分で完成させてからはじめて動画を見ると、はなこを意識していても自分の動きに無駄があることに気づきます。
今回初めて、動画通りに手順書を作成し自分でもう一度その通りに書いてみました。
うまくいったのでこれからはまず自分で手順書を書いてからマクロを書き始めるようにします♪
結果から逆順にたどればいいんですよね(v´∀`) こうして見ると完全に美しい入れ子構造になってますね(人*´∀`)
手順書はこのような感じになりました↓
「[2] 男性の場合は80点以上、女性の場合は70点以上を合格」
01 [団子]. 「合格」と記入するお団子を作る。range.value
02 [は]. If文で合格条件を記述する箱を作るIf then else end if
03 [な]. 【01 [団子].】を【03 [は].】の中に入れる
04 [こ].加工する (⇒新しい団子Aとなる)
05 [は]. If文で性別条件を記述する箱を作るIf then else end if
06 [な].【04 [こ]. (新しい団子A)】を【05 [は].】の中に入れる
07 [こ]. 加工する (⇒新しい団子Bとなる)
08 [は]. 繰り返し用の箱を作る。For Next
09 [な]. 【07 [こ]. 新しい団子B】を【08 [は].】の中に入れる
10 [こ]. 加工する (⇒団子完成)
Excelって賢いですね。
でも私のvbeには出ません(*ノД`*) excel 2010では非対応の機能ですか?
キーボードの音がよく入っていたおかげで、小川先生のタイピングスピードがどれだけ速いかが実感できましたヾ(*≧∀≦*)ノ
私もタイピングスピードが上がるように練習していきますo(`・д・´)o
左から右へのリストアップは、業務でも多いので、とてもありがたいです。これを応用していくと別シートからも参照できますか?Worksheets("Sheet1")みたいに使う事もできそうだと思いました。
migi=5、migi=migi+1のコードも、言われるだけでは良く分からなかったのですが、実際に動作に合わせて作ってみることで確認させていただきました。
ありがとうございます。
以下のように、変数を設定して、コードを作りましたが、
全体的な概念として、変数の数は、抑える方にした方が良いでしょうか。
ご教示よろしくお願いします。
Sub guru()
Dim shozoku
Dim guru_no
Dim gyo
For gyo = 2 To 11
shozoku = Range("B" & gyo)
guru_no = InStr(shozoku, "都島")
If guru_no > 0 Then
Range("J" & gyo) = "都島グループです"
End If
Next
End Sub
1問目は、最初、下のように、作りました。
動画で、先に、①行Noを特定 して、後で、②該当のセル(J列)
に、ピンポイントで入れる、
という、お団子2個 作ることが、勉強になりました。
[Sub takai()]
[]
[ Dim dekai]
[ dekai = 0]
[ Dim gyo]
[ For gyo = 2 To 11]
[ If dekai < Range("G" & gyo) Then]
[ dekai = Range("G" & gyo).Value]
[ Range("J" & gyo) = "最高点です"]
[ Range("j2:H" & gyo - 1) = ""]
[ ]
[ End If]
[ ]
[ Next]
[ ]
[/End Sub]
Dim migi
Dim goukei
Dim hidari
Dim konrui
Dim sourui
For hidari = 4 To 9
goukei = 0
For migi = 4 To 10
If Range("I" & migi).Value = Range("B" & hidari).Value Then
goukei = goukei + Range("J" & migi).Value
'End If 'これが正解(A)
'Next 'これが正解(B)
Range("D" & hidari).Value = goukei
Range("E" & hidari).Value = Range("C" & hidari).Value + goukei
End If '条件が合致していると、End Ifは関係なくfor Next内を進む。(C)
'条件が合致していないとEnd If外に進む。
konrui = konrui + goukei
sourui = sourui + Range("E" & hidari).Value
Next(D)
Next
Range("D10").Value = konrui
Range("E10").Value = sourui
End Sub
すいません、コピーを張り付けることができるなら今後そうします。質問の意味が自分でも不明です。
End ifが(C)の位置だとてっきりIfにもどるものと思って言いました。
If then end ifは条件が一致すると常にそのまま進むものであるのでしょうか。
If thenだけでend if を使用しない構文(多分?)の場合とはどのように使い分けるのでしょうか。
動画11のend ifの位置について質問です。以下のプログラムは先生通りです。
(A)の位置が正解ですが、条件が一致した場合、(B)の位置の場合end ifに関係なく次の行に進みます。end if までで一区切りになって ifにもどりません。なぜでしょうか。?
sub countkobetu()
dim kobetu()
dim migi
dim hida
dim konrui
dim sourui
for hida =4 to 9
kobetu=0
for migi=4 to 10
if range("I" & migi).value=range("B"& hida).value then
kobetsu=kobetu+range("J"&migi).value
end if (A)
next
range("D" & hida).value=kobetsu
range("E"& hida).value=range("C"&hida).value+kobetu
(B)
konrui=kobetu+konrui
sourui=range("E"&hida).value+sourui
next
range("D10").value=konrui
range("E10").value=sourui
end sub
フォローアップkiso6の問題の動画を見る前に フォローアップkiso4の内容を利用して マクロを以下書いてみました。
結果は同じでしたが、
Range("列名" & 変数×3−2).Value のfor next構文の方がシンプルで
書く時間も半分で済みますね!
勉強になりました。
Sub kiso6no1()
Dim ketugou
Dim gyo
gyo = 1
For ketugou = 1 To 28
If Range("A" & ketugou).Value <> "" And Range("A" & ketugou + 1).Value <> "" Then
Range("C" & gyo).Value = Range("A" & ketugou).Value & Range("A" & ketugou + 1).Value
gyo = gyo + 1
Else
End If
Next
End Sub
Dim siso
Dim count
Dim gyou
Dim kanpyou
Dim nomimono
For gyou = 4 To 33
siso = Range("C" & gyou).Value
If siso = "しそ巻き無料" Then
count = count + 1
End If
Range("F4").Value = count
Next
Dim count1
For gyou = 4 To 33
siso = Range("C" & gyou).Value
If kanpyou = "かんぴょう巻き無料" Then
count1 = count1 + 1
End If
Range("F5").Value = count1
Next
Dim count2
For gyou = 4 To 33
siso = Range("C" & gyou).Value
If nomimono = "飲み物無料" Then
count2 = count2 + 1
End If
Range("F6").Value = count2
Next
End Sub
なぜ変数は、最初のFor~Nextの中でしかカウントされないのでしょうか。
カウントされない理由はなぜですか。?
もう一つ質問です。
動画のmondai1の回答 03のマクロ(以下)ですが、
dim gyo の後にAs Long と書かれています。
これは何か教えてください。
Sub kaitou03()
Dim gyo As Long
For gyo = 2 To 11
If Range("C" & gyo).Value > 100 Then
Range("A" & gyo).Value = "○"
Else
Range("A" & gyo).Value = "×"
End If
Next
End Sub
別の質問です。
IF文で日付をの曜日が日曜日ならセルの色を赤にする といったマクロを以下書いたつもりでしたが、
小人ちゃんが動きませんでした。
エクセルにはあらかじめA3に201/11/30(日)と表記しています。
この表記は セルの書式→ユーザー定義 で yyyy/mm/dd(aaa) と設定し、A3には11/30 と打ち込みました。
やはり書式の(aaa)は曜日の文字として認識されないのでしょうか。
Sub dinichiro()
If InStr(Range("A3").Value, "日") > 0 Then
Range("A3:F3").Interior.Color = vbRed
End If
End Sub
仕事がらスケジュールを作成することが多く、土日祝はセル色を変えています。
現在は力技(ネット上で紹介されている条件付き書式で実施。祝日は、名前の定義で祝日のみを打ち込んだ日付を範囲選択し、これを条件付き書式で利用)ですが、
関数が複雑に入っているとファイルが重く、開くのに時間がかかったり、開かず強制終了が起こったりで困っています。
ちなみに現在のエクセルにはB列(B3~B100あたり)にMID("月火水木金土日",WEEKDAY(A3,2),1)の数式を入れて曜日を表記し、これを先ほどの条件付き書式で色つけしています。マクロも似たようなやり方になるのでしょうか(こちらもデータの型でしょうか)。
先生が動画でおっしゃっていたハナコのステップが呪文のように頭に出てきて(この動画の刷り込みは本当に感謝です!)、
私も口「箱(for next文,if文)をつくる。home shift ↓↓↓、tabでずらして切り取って、貼り付ける。あとは加工して終わり!」と言いながら
全くその通りにマクロが書けました。このおかげで、迷いなく、手が止まって考えることなくスラスラと!さらに小人ちゃんが動いてくれるので、
何度書いてもやみつきになりそうです!
Enshu00100_Basic.xls のmondai1でわからないことありましたので、ご指導お願いいたします。
質問1:
C8とC10をテンキーのマイナスで打ち込み「-」と表記しますと、以下のマクロではA8とA10に「○」と記入されます。
このマクロは数値に対しての条件であるから、数値を除く文字が入ると誤作動を起こすと考えてよろしいでしょうか。
以下は動画でも開設された回答です。
Sub mondai1()
Dim ten
For ten = 2 To 11
If Range("C" & ten).Value > 100 Then
Range("A" & ten).Value = "○"
Else
Range("A" & ten).Value = "×"
End If
Next
End Sub
Enshu00100_Basic.xlsのC列の書式設定は「通貨」で、C8とC10は「‐」表示されており、セルの書式設定で確認するとだと0と打ち込まれていました。
マクロは100以下の数値と認識し、正確に×と記入されました。
私は自分の練習用エクセルファイルにこの設問と似た感じのレイアウトをつくり、設問の表記を真似たつもりでしたが、C8とC10はテンキーのマイナスを打ち込み「-」と表記しました。
このときのセルの書式設定は標準でした、この条件で上記のマクロで実行しましたところマクロは100より大きいと認識し、A8とA10に○と記入されました。
C8とC10を空欄にしますとA8とA10ともに×と記入されました。セルの書式を「通貨」に変えて同様に確認しましたところ同様のことが起こりました。
ちなみに数値でない文字を入れると、すべてこのようになることを確認しました。
質問2:
エクセル知識がない私のような人間は元データに「0」をテンキー「-」と記入してしまうケースはあると思います。
(書式設定で¥を表記しているのに、打ち込み担当が一時変わって¥を書く人がいるかもしれない。)
そのミスをも防ぐマクロをif文に(C1~C11のセルの値が数値なら上記のif文を実行する、そうでなければ(文字列なら)C1~C11のセルの値に”入力ミス"と記入する)
といったマクロをかければと思いましたが、書けませんでした。こういったものは発展でのお話になりますでしょうか。これまでの基礎編が理解できていれば
対応できそうなマクロであればご教授お願いいたします。
(Len関数を組合せてうまくできないか考えましたが、数値もカウントしてしまいますので私では対応できませんでした)
ifの入れ子は、ifとend ifで指定した方が、分かりやすいと思いますが、いかがでしょうか。
作成方法がハナコでやると簡単に作成出来て良いですね。
ゲームをやっていて時間を忘れてしまうような、あの感じです。
今までの回で、書いていく中で、色々試して失敗しましたが、その失敗の方法が今回使えたりと、たくさん失敗する意義を感じる最終回でした。
今の頭の状態で、もう一度、第一回目から、新たな発見と知識の定着のため、マクロを書いてみようと思います。
発展編でもお世話になると思いますが、よろしくお願いします。
基礎編の分かりやすい動画解説、ありがとうございました。
組み合わせて色々できる幅が広がるのは楽しいです。
引き続きよろしくお願いします。
自力で考えながら書き上げることができました。
前回つまずいて変数の考え方を理解できたので、今回はそんなには苦労しなかったです。
引き続き楽しんで進めていきたいと思います。
今回は区切り文字が「/」しかなかったため、以下のように作ってみました。
Sub Sample()
Dim i As Long, kouzou As String, tmp As Variant
For i = 2 To 51
kouzou = Cells(i, 4).Value
tmp = Split(kouzou, "/")
If tmp(0) = "RC" Then
Cells(i, "F").Value = "鉄筋コンクリート"
Else
Cells(i, "F").Value = "鉄骨鉄筋コンクリート"
End If
Cells(i, "G").Value = tmp(1)
Cells(i, "H").Value = tmp(2)
Cells(i, "I").Value = Cells(i, "F").Value & tmp(2) & "建ての" & tmp(1) & "階部分"
Next i
End Sub
このケースでは、VLOOKUP関数を呼び出すことでもできますが、自分で仕組みを作った方が応用範囲が広いと思いました。
この仕組みを使えば、同一検索値で複数データを表示することも可能ですね(関数で同じことをやろうとし、苦労したことがあります)。
どちらもできるようになり、その場に応じて使い分けていきたいと思います。
まず考えましたが、変数の使い方が分からず、解説動画を見ました。
見たら「なるほどー!!」って感じです。特にmigi=migi+1の役割に!
配置する場所も重要なんですね。パズルのようで楽しいです。
ただ、楽に書く努力は足りてなかったので、これからその努力をしていきたいです。
後半の select case 楽しそうですね。発展編にたどり着けるように楽しんで進んでいきます。
引き続きよろしくお願いします。
西暦変換はググって計算式を見つけて、マクロに書き込みました。
2問目はなんとなく、こんな感じかなと思って試したらできてしまった感じです。
引き続き楽しんでいきたいと思います。
意外に書けるものだなと楽しい気分になりました!
今回の課題は、IF文の理解がまだ完全ではなく、先に動画をみて、その後に
その手順を自分で再現してみるというステップで学習してみました。
次回からは、まず、課題に挑んでみたいと思います。
発展編講座をうけられるスタート地点に到達できるように
引き続き学習進めていきたいと思います。
よろしくお願いします。
問題3をFor ~ Eachを使って書いてみました。
変数MaxはRange型の方が良かったのでしょうか?
また、このような問題の場合は、For ~ NextとCellsを使ってネストさせるより、For ~ Eachを使った方がいいのでしょうか?
その他、修正点がありましたら教えて下さい。
Sub mondai3_For_Each()
Dim rng As Range, Max As Single, r As Long, c As Long
For Each rng In Range("C6:H33")
If Max < rng.Value Then
Max = rng.Value
r = rng.Row
c = rng.Column
End If
Next rng
Cells(4, "K").Value = Cells(r, 2).Value
Cells(4, "L").Value = Cells(5, c).Value
Cells(4, "M").Value = Cells(r, c).Value
End Sub
先日はお忙しい中わざわざお電話を下さり、ありがとうございました。
まさか小川先生とお話できるとは思ってもいませんでした。
舞い上がって勝手な要望ばかり言ってしまいました。大変失礼しました。
先日も申し上げましたが、基礎動画視聴による勉強は今のところ順調です。
今日は基礎編フォローアップ動画第3回を視聴しつつキーを叩いていました。
ハナコのステップは(よっぽどのイージーミスをやらかさなければ)スムーズに正解にたどり着ける方法なので、
(いい意味で)強い衝撃を受けました。
今までプログラミングに対して抱いていた、苦手意識のようなものが少し軽くなった感じがします。
達人養成塾のオンライン講座を受講する以前に、
ExcelVBAの本(分かりやすいと評価が高い本です)を何冊か購入して独学したものの、挫折してしまっていたので、
小川先生の丁寧かつ分かりやすい説明はとてもありがたいです。
本を買う前に、最初から小川先生の講座に申し込んでいれば…、という後悔があります。
小川先生のExcelVBA講座は、オンライン講座、DVD講座ともに一つ一つ確実に学習し、
最終的には外部連携講座までマスターしていきたいです。
Web連携講座のオンライン化については、先日確認しました。非常に魅力的な講座だと思いますので、
今取り組んでいる基礎編フォローアップ動画で学習した後に「発展篇1」に(順番通りに)進むか、正直とても迷います。
先日小川先生からお話していただいたことを思い返すと、なおさらWeb連携講座への興味が強くなるところですが…、
「発展篇1」の項目の、
「For Next構文、If文だけでなく、より高度な構造文も状況によって使い分けられるようになる。」
「自動記録機能で作ったマクロを自由に編集できるようになる。」
「for each構文、do loop構文、select case構文 with ステートメント」
「組み立てのノウハウ ハンガリアン記法 より高度な抽象概念を活用できる、より簡単なマクロの書き方のパターン(アルゴリズム)」
このあたりを読んでいるとワクワクしてきますね。
「マクロを書くのが楽しくて仕方がない。」
このレベルに行けたならいいなぁと思います。
来月は勉強時間を多く取れそうなので、基礎編フォローアップ動画をすべて学習し終わった後に、
次の講座を(どちらを受講するかよく思案してから)申し込んで受講していきます。
今後ともよろしくお願いします。
>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>出力部分については考えてみてください。
とのことでしたので、一部修正し、出力部分を追加して書いてみました。
修正箇所があれば教えて下さい。
Sub hairetu()
Dim gyo As Long
Dim goukei(2) As Long
goukei(0) = 0
goukei(1) = 0
goukei(2) = 0
For gyo = 4 To 33
Select Case Range("C" & gyo).Value
Case Range("E4").Value
goukei(0) = goukei(0) + 1
Case Range("E5").Value
goukei(1) = goukei(1) + 1
Case Range("E6").Value
goukei(2) = goukei(2) + 1
End Select
Next
For gyo = 4 To 6
Cells(gyo, "F").Value = goukei(gyo - 4)
Next
End Sub
フォローアップ動画が閲覧できるようになりましたので、再開しました(それまではEnshuフォルダを先にやっていました)。
コメント欄で時折マインドマップの説明が記載されていますが、ダウンロードした資料とページ数が違います(ページが
少なくなったような感じです)。ただ、該当するページは見つけられました。
当時のコメント投稿時とは、マインドマップも修正されているということでしょうか?
まだ基本的なことしかやってませんが、プログラミングって結構やれるではないかと感じるようになり、もっと色んなことができるようになりたいと思うようになりました。
ありがとうございました。次の発展編でもよろしくお願いします。
お世話になっております。
今やっとフォロー動画をすべて終了致しました。
最後の方はなかなか考えさせられました。面白かったです。
発展編1に移ろうと思います。
引き続きよろしくお願い致します。
本日ようやく動画解説を見終わる
ことができました。
解説もありましたように最後の設問の
For~Nextの最初と最後の書き込みに
手間取ったのですが、以下のような
回答を作成していましたが、
これに冠する小川さんの解説は、また
しても(^^;自分では思いつかないような
手順というかアプローチの仕方でしたので
非常に勉強になりました。
最終問題ですので全体を総括させて
いただきますと、
知らないうちに非常に短期間に業務でも
マクロを活用できるようになりましたので
非常に投資効果の高いセミナーだったと
いえるかと思います。
ありがとうございました。
発展編とのギャップがどのくらいあるかは
わかりませんが、何度か復習した後、できるだけ
はやく発展編も受講させていただきたいと
思っております。
(実は、密かに、Excelマクロによる分析を
多用する業務に移ることを目論んでおりますので(^^、)
もっともっと勉強していきたいと思います。
今後ともよろしくお願いいたします。
---
Sub kakikae()
Dim migi
migi = 2
Dim kuiki
kuiki = 0
Dim hida
For hida = 2 To 27
If Range("a" & hida).Value <> Range("a" & hida - 1).Value Then
Range("e" & migi).Value = Range("a" & hida).Value
Range("f" & migi).Value = Range("b" & hida).Value
kuiki = Range("c" & hida).Value & "地区"
migi = migi + 1
Else
kuiki = kuiki & "," & Range("c" & hida).Value & "地区"
End If
Range("g" & migi - 1).Value = kuiki
Next
End Sub
---
以下のようにコードを考えたて、一応
回答できたつもりですが、
動画解説の観点が全然違っていたので
驚きました。
上下の行で値が変化したことをトリガーに
処理を行うやり方というのは、以前の問題でも
私自身使っていますが、
今回のようにシンプルに変わったらインクリメントする、
のように、利用できるとは考えていませんでした。(^^;
考えてみれば元々の表にそういう作成者の
ロジックというか意図があってそのように
レコードが並べられているのですから、
それを素直に読み取っているとも言えますね。
毎回勉強になります。(^^
=====
Sub furiwake()
Dim gyo
For gyo = 4 To 19
’ <A B Cの判定>
If Mid(Range("d" & gyo).Value, 3) = "A" Then
Range("b" & gyo).Value = 1
ElseIf Mid(Range("d" & gyo).Value, 3) = "B" Then
Range("b" & gyo).Value = 2
ElseIf Mid(Range("d" & gyo).Value, 3) = "C" Then
Range("b" & gyo).Value = 3
End If
’<F列の値からもってくる >
Range("c" & gyo).Value = Mid(Range("f" & gyo).Value, 2, 1)
Next
End Sub
=====
お世話になります。
今回、最後の問題でM行×N列ということに
目が言ってしまい、表現を調べて以下の
ような回答を作りました。
しかしながら、小川さんの過去コメント
(持っている道具だけで何とかする・・・的な(^^; )
に触発されて、セミナーで出てきた内容だけで
(上記のM行×N列の考え方は同じで)作り直していました。
が、動画解説を見て、更に考えさせられ
ました。
一列単位の処理を拡張することで解ける問題から
発展させていくので無理がないと思いました。
最終的にやっていることは残業時間のセル同士を
比較するという意味では同じですが、
そこに至るプロセスで、
自分のできることから出発することで
一見手も足も出ない問題に対しても何らかの取っ掛かり
が見えてくるかもしれないと思いました。
=====
Sub zangyo2()
Dim zangyo
Dim shimei
Dim tsuki
Dim gyo
Dim retsu
zangyo = 0
For retsu = 2 To 7
For gyo = 6 To 33
If Range("a5").Offset(gyo, retsu).Value > zangyo Then
zangyo = Range("a5").Offset(gyo, retsu).Value
shimei = Range("a5").Offset(gyo, 1).Value
tsuki = Range("a5").Offset(0, retsu).Value
End If
Next
Next
Range("k4").Value = shimei
Range("l4").Value = tsuki
Range("m4").Value = zangyo
End Sub
=====
問題をここまでやらせていただいて
ようやくFor~Nextがわかってきた
ようです。
まず最初考えた回答が、以下のような
ベタベタのコードでした。
---回答(1)ここから---------------------------------------------
Sub shiharai()
Dim kekkon
kekkon = 0
Dim shussan
shussan = 0
Dim seijin
seijin = 0
Dim reizen
reizen = 0
Dim mimai
mimai = 0
Dim jimu
jimu = 0
Dim gyo
For gyo = 4 To 9
If Range("i" & gyo).Value = "結婚祝い" Then
kekkon = kekkon + Range("j" & gyo).Value
ElseIf Range("i" & gyo).Value = "出産祝い" Then
shussan = shussan + Range("j" & gyo).Value
ElseIf Range("i" & gyo).Value = "成人祝い" Then
seijin = seijin + Range("j" & gyo).Value
ElseIf Range("i" & gyo).Value = "御霊前" Then
reizen = reizen + Range("j" & gyo).Value
ElseIf Range("i" & gyo).Value = "お見舞い" Then
mimai = mimai + Range("j" & gyo).Value
Else
jimu = jimu + Range("j" & gyo).Value
End If
Next
Range("d4").Value = kekkon
Range("e4").Value = kekkon + Range("c4").Value
Range("d5").Value = shussan
Range("e5").Value = shussan + Range("c5").Value
Range("d6").Value = seijin
Range("e6").Value = seijin + Range("c6").Value
Range("d7").Value = reizen
Range("e7").Value = reizen + Range("c7").Value
Range("d8").Value = mimai
Range("e8").Value = mimai + Range("c8").Value
Range("d9").Value = jimu
Range("e9").Value = jimu + Range("c9").Value
Dim kongetu
kongetsu = 0
Dim ruikei
ruikei = 0
For gyo = 4 To 9
kongetsu = kongetsu + Range("d" & gyo).Value
ruikei = ruikei + Range("e" & gyo).Value
Next
Range("d10").Value = kongetsu
Range("e10").Value = ruikei
End Sub
---回答(1)ここまで------------------------------------------------
この回答を書いた後で、もっとすっきりまとめられることに
気づき書いたのが以下になります。
---回答(2)ここから------------------------------------------------
Sub shiwake2()
Dim keihi
Dim gyo_hidari
Dim gyo_migi
For gyo_hidari = 4 To 9
keihi = 0
For gyo_migi = 4 To 9
If Range("i" & gyo_migi).Value = Range("b" & gyo_hidari).Value Then
keihi = keihi + Range("j" & gyo_migi).Value
ElseIf Range("h" & gyo_migi).Value = Range("b" & gyo_hidari).Value Then
keihi = keihi + Range("j" & gyo_migi).Value
End If
Next
Range("d" & gyo_hidari).Value = keihi
Range("e" & gyo_hidari).Value = Range("c" & gyo_hidari).Value + Range("d" & gyo_hidari).Value
Range("d10").Value = Range("d10").Value + Range("d" & gyo_hidari).Value
Range("e10").Value = Range("e10").Value + Range("e" & gyo_hidari).Value
Next
End Sub
---回答(2)ここまで------------------------------------------------
この考え方になじんでからは、実務で新旧の表を比較して差分を抽出したり、
といった、今までVLOOKUP関数で行っていたような複数の表にまたがる処理が
マクロでできるようになりました。
一回限りの書き捨てのマクロでデータ整合性チェックをしたり
ができるので相当作業時間を短縮できていると思います。なれると関数より楽に、
かつ、もっと複雑な処理ができますね。もっとマクロを学ぶことで仕事自体が
劇的に変わっていく予感がしています。(^^
上記設問[3]、[4]、[5]について以下回答案作成してみました。
アドバイス等いただけますと幸いです。
よろしくお願いいたします。
===設問[3] ここから===
Sub furiwake3()
Dim kugiri1 '文字列の最初の区切り
Dim kugiri2 '文字列の2番目の区切り
Dim nagasa '文字列の長さ
Dim gyo
For gyo = 2 To 51
kugiri1 = InStr(1, Range("e" & gyo).Value, "線")
kugiri2 = InStr(1, Range("e" & gyo).Value, "駅")
nagasa = Len(Range("e" & gyo).Value)
Range("h" & gyo).Value = Left(Range("e" & gyo).Value, kugiri1)
Range("i" & gyo).Value = Mid(Range("e" & gyo).Value, kugiri1 + 1, nagasa - kugiri2 + 1)
Range("J" & gyo).Value = Right(Range("e" & gyo).Value, nagasa - kugiri2)
Next
End Sub
===設問[3] ここまで===
===設問[4] ここから===
Sub furiwake4()
Dim gyo
For gyo = 2 To 11
Dim kugiri
kugiri = InStr(Range("c" & gyo).Value, "区")
If kugiri > 0 Then
Range("f" & gyo).Value = Left(Range("c" & gyo).Value, kugiri)
Range("g" & gyo).Value = Mid(Range("c" & gyo).Value, kugiri + 1)
Else
kugiri = InStr(Range("c" & gyo).Value, "市")
Range("f" & gyo).Value = Left(Range("c" & gyo).Value, kugiri)
Range("g" & gyo).Value = Mid(Range("c" & gyo).Value, kugiri + 1)
End If
Next
End Sub
===設問[4] ここまで===
===設問[5] ここから===
Sub furiwake5()
Dim kugiri
Dim gyo
For gyo = 2 To 11
kugiri = InStr(Range("e" & gyo).Value, "線")
If kugiri > 0 Then
Range("h" & gyo).Value = Left(Range("e" & gyo).Value, kugiri)
Range("i" & gyo).Value = Mid(Range("e" & gyo).Value, kugiri + 1)
Else
kugiri = InStr(Range("e" & gyo).Value, "ル")
Range("h" & gyo).Value = Left(Range("e" & gyo).Value, kugiri)
Range("i" & gyo).Value = Mid(Range("e" & gyo).Value, kugiri + 1)
End If
Next
End Sub
===設問[5] ここまで===
ハナコのステップを忘れていましたが、すぐ思い出せました。
今日からまたよろしくお願いいたします。
この作成順(はなこ)はもっとも単純なところから積み上げていくので、わかりやすいだけでなく、出戻りが無く、確実ではやい手順だと感じました。身体に染み込ませるように練習したいと思います。
引き続きよろしくお願いいたします。
12回目で、理解に少々時間がかかったのですが、
解ると、こっちは、すんごい簡単ですね。再生せずに出来ました。
面倒で嫌だった定型業務がまた1つ解決しました^^
やり方を、色々工夫出来る所が楽しいですね。
Range("I" & gyo).Value = Mid(eki, sen + 1, toho - sen - 1)
range("A6").value 等のマクロ記入の際、("A6")入力時の指の動き及び順番はどうされてますか?
動画で、小川さんの入力を観ている限り、左から順に、 ("A6)と入力されていると思います。
[shift]と組み合わせて入力する文字や記号の場合、[shift]ではない方の入力は、
[shift]を押す手と逆の手を使う。という教えを守ると下記のようになると思います。
[shift]が右に行ったり左に行ったりして、なかなかスムーズに入力ができません。
これは練習しかないのでしょうか?
どうしても、マクロ記入時は、切っても切り離せない入力パターンなので、
ご質問させていただきました。
説明が分かりにくかったら申し訳ございません。
ご教授のほどよろしくお願いいたします。
■以下、私の指の動き及び順番です。
1、左手 小指 [shift] + 右手 中指 [8] で (
2、右手 小指 [shift] + 左手 薬指 [2] で "
3、右手 小指 [shift] + 左手 小指 [A] で A
4、左手 小指 [shift] + 右手 人指指 [6] で 6
5、右手 小指 [shift] + 左手 薬指 [2] で "
6、左手 小指 [shift] + 右手 薬指 [9] で )
昨日みた動画のマクロを書いてみて、できてから今日の同がを見るようにしています。
昨日の内容でもまださらさらかけませんが、手ごたえを感じています。
Home Sift 下 下 下 箱を作って切り取って タブでずらして 切り取って 貼り付ける
をするときに意識して声に出してみようと思います。
この講座の利用方法
講座を利用するには、以下の2つの方法があります。
- この講座を含む定額コースに参加する
- この講座を購入する
この講座を含む定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
この講座は、以下の定額コースに含まれています。
- 【お試し】初級コース(サポートなし) 980円/月 ~
- 初級コース 1,480円/月 ~
- 中級コース 2,980円/月 ~
- 中上級コース 3,980円/月 ~
-
この講座は購入可能です
(9,800円)