残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ

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

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

解説

演習問題テーマ:残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ

勝ち抜き戦の基本パターン。

勝ち抜き戦勝者をあらわす変数をたてること、暫定勝者の値をきめること、暫定勝者と対戦相手の値を比較して値の大きいほうが勝者になり、次の対戦相手の値と比較するということを繰り返し、最後まで勝ち抜いた勝者が最も大きい値を示す仕組みを学んでください。

勝ち抜き戦の対戦相手が同じ列にいるか、複数の列にいるかによって、暫定勝者の値が列名と数字か、数字だけになるという仕組みもよくみてください。

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

11209 : 小川慶一の回答 (2019-02-26 11:52:44)

jinoseさん:

リアルもPC内でくり広げられることも、本質的には違いはないです。
ただ、表現方法が違うだけです。リアルとPC内で起きていることとの境界がはずれてくると、ますます上達しますよ!

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


> [感想]
> 「勝ち抜き戦・暫定王者・挑戦者」という用語を用いた説明が大変わかりやすく、すんなりと理解出来ました!


11207 : jinoseさんのコメント (2019-02-25 22:17:22)

[感想]
「勝ち抜き戦・暫定王者・挑戦者」という用語を用いた説明が大変わかりやすく、すんなりと理解出来ました!


10162 : 小川慶一の回答 (2018-06-27 10:51:21)

morimotoさん:

お返事したつもりでいました。
失礼いたしました。

発展編に行くと、縦横に広がったセル範囲内で「いちばん大きい値を調べる」とか「特定の条件にマッチしたセルのリストを別のどこかに作る」といったこともサクサクできるようになります。
基礎編なんで、今は力技的ですね。

ひきつづきよろしくお願いいたします。



> もうこうなったらいつもの紙とブレークポイント、F8,
> msgboxを作り値の検証をしてやっとわかりました。
> C列の暫定勝者とD列の暫定勝者を比較し、D列が勝ったら
> RETSU="D"を設けないとだめですよね。。。
> 地道にやって理解できまずはほっとしてます。
> 実務でも同じような場面がありそうでほんとに役立つ講座です。


10149 : morimotoさんのコメント (2018-06-22 16:26:34)

もうこうなったらいつもの紙とブレークポイント、F8,
msgboxを作り値の検証をしてやっとわかりました。
C列の暫定勝者とD列の暫定勝者を比較し、D列が勝ったら
RETSU="D"を設けないとだめですよね。。。
地道にやって理解できまずはほっとしてます。
実務でも同じような場面がありそうでほんとに役立つ講座です。


10148 : morimotoさんのコメント (2018-06-22 16:22:05)

3つ目の問題は4-5日考えましたがわかりませんでした。
解説講義を見て、「なんとなくわかったつもり」では
いけないので見た後に復習をしましたが、できませんで
した。やることは単に各列の勝者を比べるだけなのですが
、retsuを変数にしretsu="c",,,ということがつかみきれず


10052 : 小川慶一の回答 (2018-05-27 10:55:45)

マメコトさん:

コメントありがとうございます。

横方向へのループはウチでは発展編1で取り扱います。

基礎編であえてそこまで説明しない理由は、まさにお書きになっているとおりです

Cellsの使い勝手...というか、限界についても発展編1テキストにて解説しています。


10049 : マメコトさんのコメント (2018-05-26 15:45:24)

『行をループさせて最大値を取り、その後列をループさせて表の最大値を獲得する』というアイデア(設計図)を思いついたものの、列をループさせる手法が思いつかず、結局何度も似たようなForループをコピペして「とりあえず動く」マクロを書いたものの、エレガントとは言えない方法だなぁと思っていました。解決策をネットで検索して、手法として使えそうなcellsを知りました。
四苦八苦しながらcellsで動くマクロを作成(過去に投稿された方のコードと全く同じ)し、それから動画を見ました。
ところが、そのエレガントとは言えない方法(ベタな方法)が解説されている動画を見て、自分の考え方に根本的な誤りがあることに気づきました。
つまり『まだ白帯の私が高度な技を憶えようとするのは早すぎる。学んだことを徹底して反復練習することが先決』ということです。
実際、ベタな方法でコードを書くのには、15分もかかっていないのに、慣れないcellsを検索して試行錯誤するのに3日もかかってしまいました。
cellsという手法もどうやらベストではないらしく、for each構文その他、将来学ぶべきことはまだあるらしいということも知りました。
もう、ネットで検索するのに時間を費やして演習時間を減らすという迂遠な方法は止めます。
たぶん、この講座のカリキュラムに沿って学ぶ方が、最速でマクラー(マクロを自在に操れる人。そんな言い方するのか不明)になれる気が本当にするからです。
今後もよろしくお願いします。


9314 : 小川慶一の回答 (2017-12-28 14:54:02)

受講生 さん:

もう、十分に、発展編1で学べるレベルです。
というか、そろそろお勧めなタイミングかと思います。

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


9311 : 受講生さんのコメント (2017-12-28 13:54:44)

小川先生、こんにちは。

勝ち抜き戦マクロ、以前この仕組みを考えるときに
冬季五輪のジャンプ等の競技をイメージしたことを
思い出しました。
変数に初期値を与えて、1行ずつ変数値と比較していき
値が上回ったら変数を書き換える仕組みですね。
正解をみて、無駄なステップを多少修正しましたが、
今回も順調に解けました(*´▽`*)

おかげさまで、基礎編で学んだ素材だけでマクロを作る手法には
だいぶ自信がついてきました。

今後もフォローアップの問題を進めながら、
そろそろ発展編に取り組もうと思います。
年明けからの職場では、他人が作ったマクロを実務で運用することになるので
一般的な基礎知識を広げておく必要を感じるからです。

まだまだだと思いますが、引き続きよろしくお願いいたします。
gooska


9275 : 小川慶一の回答 (2017-12-22 22:02:57)

吉川 裕子さん:

基礎編は腕力をしっかりつけること重視なので、やたらに道具を渡すよりも、基本のアルゴリズムの組み合わせで仕事をできるようになることを目指しています。
基礎編の演習すべて終えたころには、相当に応用力がついていることと思いますよ。

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


9274 : ガラパゴスタディー吉川の回答 (2017-12-22 16:49:58)

基礎編ということなので、コメントは最小限にいたしますが、Max、Minなどは実務ではワークシート関数として使っていたので、今回のようなマクロの書き方もできるんだというところがおもしろかったです。
実はこういう基礎の基礎みたいな部分が抜けているので、多分応用がきかないのかもしれない、なんてちょっと思っております。
引き続きよろしくお願いいたします。


8931 : 小川慶一の回答 (2017-09-25 16:14:13)

金子 伊智郎さん:

きちんと答えが出たのであればよいかと思います ^_^*

ここまで、順調でしょうか?


> 小川さん お世話になっています。
> 時間を見つけてフォローアップを進めております。
> 問題[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


8923 : 金子 伊智郎さんのコメント (2017-09-25 14:11:10)

小川さん お世話になっています。
時間を見つけてフォローアップを進めております。
問題[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


8900 : 小川慶一の回答 (2017-09-17 12:01:22)

受講生 さん:

> ・複数列について調べる際は、列ごとに比べ、条件に合うセルを残していくようにする。

基礎編レベルだと、こういうベタな方法しかないですね。
発展編まで行くともっと華麗なやり方がありますが..ともあれ、ベタな方法だったとしても、解決できないよりはだいぶ良いですので。ベタな方法を解決しきる力をつけることも、すごく重要なので (^^;


8895 : 受講生さんのコメント (2017-09-17 09:15:48)

・互いのセルの数値を比べ 条件に合うセルを kati=gyo とすることで選択範囲のセルに対して必要なセルを選び出すことができる。

・複数列について調べる際は、列ごとに比べ、条件に合うセルを残していくようにする。


8802 : 小川慶一の回答 (2017-08-30 16:37:51)

受講生 さん:

簡単でしょ☆

> 小川先生
>
> RANK関数とFor ~ Eachを使用して、ベスト4を一覧出力できました。
> どうもありがとうございました。
>
> >受講生 さん:
> >
> >基礎編でもできますけどね。
> >
> >発展編1の知識でいくなら、 worksheetfunction.rank 関数で各値の順位が分かるので、その値が 1-10 のときはなんたら、とすればオシマイ。
> >
> >基礎編でいくなら、まずは最大のものを求める。
> >次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
> >また次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
> >...
> >という具合です。
> >
> >
> >> 小川先生、お世話になっております。
> >> 下のコメント欄の4977で、「発展編1の知識があれば、ベスト10の出力は可能」とのことですが、方針すら思い浮かびません。
> >> 何かヒントを頂けると助かります。
> >


8796 : 受講生さんのコメント (2017-08-28 21:35:59)

小川先生

RANK関数とFor ~ Eachを使用して、ベスト4を一覧出力できました。
どうもありがとうございました。

>受講生 さん:
>
>基礎編でもできますけどね。
>
>発展編1の知識でいくなら、 worksheetfunction.rank 関数で各値の順位が分かるので、その値が 1-10 のときはなんたら、とすればオシマイ。
>
>基礎編でいくなら、まずは最大のものを求める。
>次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
>また次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
>...
>という具合です。
>
>
>> 小川先生、お世話になっております。
>> 下のコメント欄の4977で、「発展編1の知識があれば、ベスト10の出力は可能」とのことですが、方針すら思い浮かびません。
>> 何かヒントを頂けると助かります。
>


8794 : 小川慶一の回答 (2017-08-28 17:08:37)

受講生 さん:

基礎編でもできますけどね。

発展編1の知識でいくなら、 worksheetfunction.rank 関数で各値の順位が分かるので、その値が 1-10 のときはなんたら、とすればオシマイ。

基礎編でいくなら、まずは最大のものを求める。
次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
また次にまた同じようなループをまわし、その最大値を超えない最大値を調べる。
...
という具合です。


> 小川先生、お世話になっております。
> 下のコメント欄の4977で、「発展編1の知識があれば、ベスト10の出力は可能」とのことですが、方針すら思い浮かびません。
> 何かヒントを頂けると助かります。


8786 : 受講生さんのコメント (2017-08-28 11:21:45)

小川先生、お世話になっております。
下のコメント欄の4977で、「発展編1の知識があれば、ベスト10の出力は可能」とのことですが、方針すら思い浮かびません。
何かヒントを頂けると助かります。


7635 : 小川慶一の回答 (2017-02-09 10:12:53)

受講生 さん:

自分で書いてフィードバックをもらうと、深く学べますね。

>小川先生
>
>コメント有難うございます。
>「英単語1語の言葉」の選択には、要注意ですね。
>
>「ハンガリアン記法」の動画を見直してみたいと思います。


7630 : 受講生さんのコメント (2017-02-09 07:05:36)

小川先生

コメント有難うございます。
「英単語1語の言葉」の選択には、要注意ですね。

「ハンガリアン記法」の動画を見直してみたいと思います。


7624 : 小川慶一の回答 (2017-02-08 08:47:32)

受講生 さん:

とてもよいと思います。
基礎編レベルの技術で書くならこれがベストかと v(^^

一点だけあえて言うなら、僕が基礎編、発展編1レベルの知識しかない受講生だったとしたら、変数名は「Most」にはしません。
英単語1語の言葉って、エクセルVBAの予約語で使われている可能性が高いからです。

SortとかLeftとか、Midとか、そうですね。

初心者の方が、

Sub Left()
    ...
    ...
    ...
End Sub


なんていうプロシージャ名のプログラムを書いて、ハマる例をよく見かけます。
その状態でLeft関数を呼び出そうとすると想定外の挙動をする可能性大。

ということで、僕なら、 Saidai とかそういう名前にするかな。
発展編1まで受講済で「ハンガリアン記法」を学んでいらっしゃるなら、 dMax とかそんな名前もいいかも。先頭のdは As Double の意味。

>小川先生
>
>コメント有難うございます。[a]の方法のマクロを投稿します。
>最大値を変数(Most)に入れようにしました。
>最初に投稿したものよりは、シンプルなコードになったような気が
>します。


7619 : 受講生さんのコメント (2017-02-07 23:55:48)

小川先生

コメント有難うございます。[a]の方法のマクロを投稿します。
最大値を変数(Most)に入れようにしました。
最初に投稿したものよりは、シンプルなコードになったような気が
します。

'********
'問題[1]
'********

Sub katinuki()
    Dim gyou As Long
    Dim Most As Long '最大値用の変数
    
    '処理1→最大値を取得
    For gyou = 2 To 11
        If Most < Range("G" & gyou).Value Then
            Most = Range("G" & gyou).Value
        End If
    Next gyou

    '処理2→全件調査
    For gyou = 2 To 11
        If Range("G" & gyou).Value = Most Then
            Range("J" & gyou).Value = "最高点です"
        End If
    Next gyou
End Sub

'********
'問題[2]
'********

Sub kati2()
    Dim gyou As Long
    Dim Migi As Long
    Dim Most As Long '最大値用の変数
    
    '処理1→最大値を取得
    Migi = 4
    For gyou = 6 To 33
        If Most < Range("C" & gyou).Value Then
            Most = Range("C" & gyou).Value
        End If
    Next gyou
   
    '処理2→全件調査
    For gyou = 6 To 33
        If Range("C" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("C" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
    Next gyou
End Sub

'********
'問題[3]
'********

Sub kati3()
    
    Dim gyou As Long
    Dim Migi As Long
    Dim Most As Long '最大値用の変数
    
    Migi = 4 '追加
    
    '処理1→最大値を取得
    For gyou = 6 To 33
        If Most < Range("C" & gyou).Value Then
            Most = Range("C" & gyou).Value
        End If
        If Most < Range("D" & gyou).Value Then
            Most = Range("D" & gyou).Value
        End If
        If Most < Range("E" & gyou).Value Then
            Most = Range("E" & gyou).Value
        End If
        If Most < Range("F" & gyou).Value Then
            Most = Range("F" & gyou).Value
        End If
        If Most < Range("G" & gyou).Value Then
            Most = Range("G" & gyou).Value
        End If
        If Most < Range("H" & gyou).Value Then
            Most = Range("H" & gyou).Value
        End If
    Next gyou
    
    '処理2→全件調査
    For gyou = 6 To 33
        If Range("C" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("C" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
        If Range("D" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("D" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
        If Range("E" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("E" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
        If Range("F" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("F" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
        If Range("G" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("G" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
        If Range("H" & gyou).Value = Most Then
            Range("K" & Migi).Value = Range("B" & gyou).Value
            Range("L" & Migi).Value = Range("H" & "5").Value
            Range("M" & Migi).Value = Most
            Migi = Migi + 1
        End If
    Next gyou
End Sub


以上、よろしくお願いします。


7616 : 小川慶一の回答 (2017-02-07 13:57:37)

複雑なプログラムだなと思って読んでいましたが...そのような工夫をしたいという意図があったのですね。

この程度のデータ件数であればたいした時間の差になりません。
なので、僕なら、単純に、「処理1」では、最大値を取得してそれを変数に格納することだけを目指すかと思います。
「処理2」では、改めて全件調査して、その値と一致した場合のみリストに追記します。

では、データ数が多い場合はどうするか?ということになりますが...。
以下の2つですね。
[a] 「時間はかかるもの」と割り切ってじっと待つ
[b] 澤崎さんがしたようななんらかの工夫をする(パフォーマンス向上目的なら、もっと他にやり方ありそうです)
[c] 「処理2」では、発展編1で紹介する ForEach構文や.Findメソッドを利用し、効率的に該当セルを見つけるようにする。

[a]は、最初に「僕なら...」と言って示したやり方。基礎編ですし、「できないよりはいいじゃん」ということで。
[b]は、基礎編レベルの知識で無理やりパフォーマンス向上を目指すなら、ということで。煩雑になるのは避けられませんが、やりきれれば腕力はつくでしょう。
[c]は、「腕力でなく技で勝つなら」という感じかな。

よろしければ[a]の方法のマクロを書いてまたここにアップしてください。


7613 : 受講生さんのコメント (2017-02-06 23:39:10)

小川先生

構成としては、2つのパート(「処理1」と「処理2」)に分けて
コードを書きました。
「処理1」は、データの先頭行から最大値を調べる。
「処理2」は、「最大値が見つかった行」を含めて、最大値含む行を調べる。
これにより、最大値が複数あった場合でも、最大値含む行の抽出にも対応可能
です。

だだ、処理2に関しては、データの先頭行から調べているため、
無駄だな~と思ったため、本日、もう一度、コードを見直ししました。
問題[1]と問題[2]のコードは、「処理2」for next構文の開始値を
「最大値が見つかった行(変数kati)」に変更して、動作確認をしました。

変更前

  For gyou = 2 To 11 


変更後
  For gyou = kati To 33 


問題[3]ですが、for next構文の開始値の見直しを保留としました。
難しそうです・・・

以上、よろしくお願いします。


7609 : 小川慶一の回答 (2017-02-06 10:29:33)

受講生 さん:

拝見しました。

まずは、ご自身でコードの内容について評価いただけますか。
それを読んだ上でコメントしたいと思います。


>小川先生
>
>最大値が複数存在した場合についてのコードを投稿します。
>よろしくお願いします。
>
>【課題を以下の通り、設定しています。】
> 問題[1] 一番得点の高い人が複数いた場合でも抽出可能にする
> 問題[2] 残業時間が一番多い人が複数いた場合でも抽出可能にする
> 問題[3] 残業時間が一番多い人が複数いた場合でも抽出可能にする
>
>

>'**************************************************************
>'問題[1] 一番得点の高い人が複数いた場合でも抽出可能にする
>'**************************************************************
>

>


7604 : 受講生さんのコメント (2017-02-05 14:09:18)

小川先生

最大値が複数存在した場合についてのコードを投稿します。
よろしくお願いします。

【課題を以下の通り、設定しています。】
 問題[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


7069 : 小川慶一の回答 (2016-09-23 15:58:27)

ゲスト さん:

本件、その後いかがですか?
もし未解決のようでしたら、よろしければ、少しヒントを出しますが。

> ゲスト さん: おもしろい課題ですね。 まずは、 ご自身で考えてみてください!
> >残業時間が最大な人が複数いた時に該当者、全て抽出する方法は?


7016 : 小川慶一の回答 (2016-09-08 20:35:01)

ゲスト さん:

おもしろい課題ですね。
まずは、 ご自身で考えてみてください!

>残業時間が最大な人が複数いた時に該当者、全て抽出する方法は?


7012 : ゲストさんのコメント (2016-09-07 20:05:40)

残業時間が最大な人が複数いた時に該当者、全て抽出する方法は?


6520 : 小川慶一の回答 (2016-04-26 18:55:16)

受講生 さん:

>元にもどす方法ですが、質問した後、動画をじっくり見て、できるようになっております。
>それも、すべてショートカットで。

おお!すごいですね!
このプロセスが先々の学びの糧になりますように。

>動画の右上には、Alt+F+1 とでていますが、それだとなにも起こりません。
>もしかしてそこは、Alt+F+O+1 でしょうか。

すいません。そこは動画内の表示がおかしいようです。
修正させます。

ひきつづきよろしくお願いいたします。


6510 : 受講生さんのコメント (2016-04-25 05:16:08)

小川慶一 さん:

お世話になっております。
元にもどす方法ですが、質問した後、動画をじっくり見て、できるようになっております。
それも、すべてショートカットで。
ですがただひとつ、エクセルファイルをもう一度立ち上げるときのショートカットを再現できません。
動画の右上には、Alt+F+1 とでていますが、それだとなにも起こりません。
もしかしてそこは、Alt+F+O+1 でしょうか。
そうしたら、うまくいきました。

とりあえず、自分の中では解決しましたが、Alt+F+1 でいくはずだ、ということでしたら
ご教授いただけますと幸いです。

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


>受講生 さん:
>
>ショートカットキー以前に、マウスを使ったらどういう操作になるかは分かりますでしょうか。
>まずはそれを書き出してみてください。
>その投稿に対して、それぞれの操作に対応した(または、より簡単な操作に対応した)ショートカットキーを記載したいと思います。
>
>
>
>>小川様
>>
>>お世話になります。
>>誤ってマクロを動かしてしまって、それをもとに戻すシーンがありますが、ショートカットを使って素早く元に戻しているのは、動画の右上にでてくるキー表示をみてわかりました。
>>しかし、あまりにも素早くて、マネしようと思っても、押すキーが間違っているのか、動画のようにうまくいきませんでした。
>>別の動画で解説しているとのことでしたが、見つけられませんでした。
>>お手数ですが、手順ならびに使っているショートカットキーを教えていただきますか。
>>わたしもよく間違ったマクロを実行して、失敗することが多いのですが、すぐに修復できれば、非常に助かります。
>>よろしくお願いいたします。
>>
>


6443 : 小川慶一の回答 (2016-04-18 10:55:31)

受講生 さん:

ショートカットキー以前に、マウスを使ったらどういう操作になるかは分かりますでしょうか。
まずはそれを書き出してみてください。
その投稿に対して、それぞれの操作に対応した(または、より簡単な操作に対応した)ショートカットキーを記載したいと思います。



>小川様
>
>お世話になります。
>誤ってマクロを動かしてしまって、それをもとに戻すシーンがありますが、ショートカットを使って素早く元に戻しているのは、動画の右上にでてくるキー表示をみてわかりました。
>しかし、あまりにも素早くて、マネしようと思っても、押すキーが間違っているのか、動画のようにうまくいきませんでした。
>別の動画で解説しているとのことでしたが、見つけられませんでした。
>お手数ですが、手順ならびに使っているショートカットキーを教えていただきますか。
>わたしもよく間違ったマクロを実行して、失敗することが多いのですが、すぐに修復できれば、非常に助かります。
>よろしくお願いいたします。
>


6423 : 受講生さんのコメント (2016-04-13 05:26:25)

小川様

お世話になります。
誤ってマクロを動かしてしまって、それをもとに戻すシーンがありますが、ショートカットを使って素早く元に戻しているのは、動画の右上にでてくるキー表示をみてわかりました。
しかし、あまりにも素早くて、マネしようと思っても、押すキーが間違っているのか、動画のようにうまくいきませんでした。
別の動画で解説しているとのことでしたが、見つけられませんでした。
お手数ですが、手順ならびに使っているショートカットキーを教えていただきますか。
わたしもよく間違ったマクロを実行して、失敗することが多いのですが、すぐに修復できれば、非常に助かります。
よろしくお願いいたします。


6194 : 小川慶一の回答 (2016-03-29 16:44:20)

受講生 さん:

何度か見て考えていると分かりますよね。
そして、分かってしまえば、仕組みは難しくはないです。

.Offset を使う場合は、中の数字を For Next構文で変化させながら処理します。
セルの指定は、その場合は、 .Offset だけで行ったほうがよいですね。


6164 : 受講生さんのコメント (2016-03-28 21:51:22)

動画をもう一度見て、他の列も比べていくやり方、ようやく理解しました。
他の列は新たなIF文を立てて調べていけばいいのですね。
最高値が更新される時だけ、その列記号を変数に代入すればいいと。
ちょっと難しく考えすぎていたみたいです。

offsetを使おうとしたんですが、IFの条件式を満たしたときに、次の行どうしたらいいかで
詰まってしまいました。
If Range("C" & gyo).Offset(0, 1).Value > Range(retu & syui) Then
「起点から左隣の列のあるセルが、暫定1位のセルデータを上回ったらば」
この列の位置を、変数retuにどう代入したらいいのかと。

もしここで代入ができたら、列移動して比較を続けていく処理を、入れ子のForNext構文に
できそうな気がしたのですが・・・
発展編ではもっとすっきりな方法があるそうなので、
手持ちの材料ではこの辺が精いっぱいでしょうか(;´・ω・)
by gooska


6160 : 受講生さんのコメント (2016-03-28 14:07:52)

小川慶一 先生:

>受講生 さん:
>
>その後どうでしょう?
>すでに何らかのトライをされたかもしれませんね。まずは、またのフィードバックいただければと思います。

あれからいろいろ模索しています。ちょっと遠回りなのですが、まずは
単月集計からの積み上げ方法を考えました。
導入編で学んだマクロの連続実行を使っています。
分けなくても連続処理が使えそうなのに、なぜ?という気持ちもありますが;(;´・ω・)
うまく書けないときの回避策として、最終目標を得る手段をいろいろ試したかったので;

Sub syukei_1gatsu()        '単月集計を連続実行する
    Dim gyo
    Dim syui
    syui = 6
    For gyo = 6 To 33
        If Range("C" & gyo).Value > Range("C" & syui).Value Then
            syui = gyo
        End If
    Next
    Range("K4").Value = Range("B" & syui).Value '一番の氏名を記述
    Range("L4").Value = Range("C5").Value   '何月の集計かを記述
    Range("M4").Value = Range("C" & syui).Value '当月の最高値を記述

Call syukei_2gatsu
Call syukei_3gatsu
Call syukei_4gatsu
Call syukei_5gatsu
Call syukei_6gatsu
Call sokei003
End Sub

(中間略)
※コピペを使って、2月~6月の単体集計マクロを用意し、ワークシート上の
集計結果のリストに数値を並べることにしました。
最後に、以上の結果から半期の最高値を求めるマクロを作りました。
Sub sokei003()
    Dim sokei
    Dim gyo
    sokei = 4
    For gyo = 4 To 9
        If Range("M" & gyo).Value > Range("M" & sokei).Value Then
        sokei = gyo
        End If
    Next
    Range("k10").Value = Range("K" & sokei).Value
    Range("L10").Value = Range("L" & sokei).Value
    Range("M10").Value = Range("M" & sokei).Value
End Sub

列に変数をいれる方法は、動画を見ながらでないと書けません(;´・ω・)
ゆっくり練習しようと思います。
offsetも覚えたいので挑戦してみたいと思います。
by gooska


6134 : 小川慶一の回答 (2016-03-26 19:28:28)

受講生 さん:

その後どうでしょう?
すでに何らかのトライをされたかもしれませんね。まずは、またのフィードバックいただければと思います。


6132 : 受講生さんのコメント (2016-03-26 15:17:02)

今回は動画を見ただけで、まだ試していません。

最大値を求めるときの考え方が勉強になりました。私が浮かんだイメージは、オリンピックなどで
一人ずつ順番に競技を行い、タイムや獲得点数を競うようなケースです。
「これで期待のA選手、暫定1位に躍り出ました!残るはB国の前回メダリストC選手が残るのみです!」
みたいなアナウンスが。・・・そんなイメージで1行ずつ比較していけばいいのだなと。
この考えで単体1列の比較であれば書けそうな予感がします。

列ごとの比較ですが、ついに出てきたという感じです。
見た感じ、難しいです・・・cellを使わないとなると、offsetかな。

どこの参考書にも、rangeの解説後、比較的早くcellの解説があります。
それをあえて先生が基礎編で取り上げなかったことには理由があると踏んでおります。

私が考えた理由とは、カウント変数の指定→箱を作って切り取って中に入れる→
for next文への変数の代入で置き換えというハナコの一連の作業を考えると、
常にrangeを使うならば機械的に代入操作できるため、無駄なミスを回避できるという点です。

一見すると列移動があるときはcellを使うほうが便利そうですが、
代入ルールがrangeと異なるため、一度立ち止まって検証しなくてはならない。
cellの代入ルールを覚えたら覚えたで、rangeと混同してしまうリスクが生じます。
コードを見直す際も、こっちがrange、こっちがcell・・のように頭を切り替えなくてはならず
読みながら考えるのが複雑になりそう。・・・以上です。

どちらにしろ、列比較の連続技を書く能力はまだないので、
自分ならば単体で各列ごとのMAX値を算出し、最後に列ごとのmaxを比較すると思います。
予選勝ち抜きした人が、後日決勝戦に出るというイメージですね(笑)
by gooska


6087 : 小川慶一の回答 (2016-03-24 12:37:22)

受講生 さん:

何度も動画見なおしましょう!とてもよいと思います。

>変数もいろんな使い方があるんだとびっくりでした。

「一度値を入れたあと、再度別の値を入れられる」という仕様なので。
そういえば、For Next構文のカウンターになっている変数なんかも、そういう仕様の実用例ですね。


6033 : 受講生さんのコメント (2016-03-22 00:31:38)

小川先生へ

今回の動画を初めて見たときはちんぷんかんぷんで
ちょっとパニックになりました。(汗)
2度目でなんとなく・・・ですが、意味がわかりました。
何度も動画を確認してさらに理解を深めようと思います!

変数もいろんな使い方があるんだとびっくりでした。


4977 : 小川慶一の回答 (2015-08-31 17:23:20)

受講生 さん:

問いの前提が間違っています。
基礎編レベルのスキルだけでそこまでするのは大変です。発展編1までいけばあっという間です。

>このプログラムでベスト10を書き出すとかする場合はどう工夫すればよいでしょうか。


4958 : 受講生さんのコメント (2015-08-29 13:06:18)

このプログラムでベスト10を書き出すとかする場合はどう工夫すればよいでしょうか。


3844 : 小川慶一の回答 (2015-02-14 17:58:50)

ゲスト さん:

>マクロの存在を知らずエクセルで繰り返し作業をしていた時は、「エクセルは賢いっていうしなんとかすればこれって自動でできるんじゃないのかな?」と思いつつフラフラでした。
>今はエクセル作業がくると喜びますヽ(*>∀<*)ノ

マクロ使えると仕事に対するときに感覚変わりますよね。
とにかく、楽しんでマクロ書いていれば仕事がさくさく終わりますw

>HPに書かれている「頭がよくなる、世界が広がる」という効果も実感中です。

最初から、そこ目指して講座作っていますからね。

> 「これが身に着いたらほかの言語でもいけちゃうかも」と思うまでになっています。

そう思いますよ。
もともと言語に興味関心がある人にとってはとくにそうかと。ひととおり学び終えたら自然に次にいけるように講座も設計しています。どんどん先に進んでください。

どうか、ひきつづきお楽しみを☆


>小川先生:
>>僕が受講生に期待するのは、くだらない手作業にかかる時間を省略することでできた時間をより人生を有意義なものにするために使って欲しいということです。
>マクロの存在を知らずエクセルで繰り返し作業をしていた時は、「エクセルは賢いっていうしなんとかすればこれって自動でできるんじゃないのかな?」と思いつつフラフラでした。
>今はエクセル作業がくると喜びますヽ(*>∀<*)ノ
>
>HPに書かれている「頭がよくなる、世界が広がる」という効果も実感中です。初めての業務でも、それほど途方に暮れることなく尻尾を探しそこから速やかに積み上げられるようになり、いい感じです。今までC言語でコンピューター言語がトラウマになりつつも「せっかくソフト開発会社にいるんだから一つぐらいコンピュータ言語を習得したい」とくすぶっていたのが、VBAが使えるようになるにつれて「これが身に着いたらほかの言語でもいけちゃうかも」と思うまでになっています。また、PCを滑らかに扱えるようになり、PCとかなり仲良くなりました(人´∀`)


3843 : 佐藤 あゆむさんのコメント (2015-02-14 17:26:56)

小川先生:
>僕が受講生に期待するのは、くだらない手作業にかかる時間を省略することでできた時間をより人生を有意義なものにするために使って欲しいということです。
マクロの存在を知らずエクセルで繰り返し作業をしていた時は、「エクセルは賢いっていうしなんとかすればこれって自動でできるんじゃないのかな?」と思いつつフラフラでした。
今はエクセル作業がくると喜びますヽ(*>∀<*)ノ

HPに書かれている「頭がよくなる、世界が広がる」という効果も実感中です。初めての業務でも、それほど途方に暮れることなく尻尾を探しそこから速やかに積み上げられるようになり、いい感じです。今までC言語でコンピューター言語がトラウマになりつつも「せっかくソフト開発会社にいるんだから一つぐらいコンピュータ言語を習得したい」とくすぶっていたのが、VBAが使えるようになるにつれて「これが身に着いたらほかの言語でもいけちゃうかも」と思うまでになっています。また、PCを滑らかに扱えるようになり、PCとかなり仲良くなりました(人´∀`)

>ゲスト さん:
>
>どういうプログラムが優れているのか?という問いの答えは、そのプログラムにどう関わる人にとって?という前提によって変わります。
>http://www.exvba.com/blog/?p=4378
>
>ですから一概には言えないですが、複数の道具が出てくる段階でメンテナンス性はイマイチですね。
>
>>仕様書では、同じ概念を表すのに表記がばらばらということはない)
>
>「このプログラムを書いた人がどの表現を採用したか」という情報は、そのマクロを編集する人にとって非常に重要です。
>ごく簡単な表現以外知らないという人が書いたのでなければ、必ずそこには意図があるからです。
>
>表現が違えば、抽象概念は共通でも実装は異なります。
>たとえば、以下はシート「Sheet1」にある複数セルを選択する表現ですが、すべて実装は異なります。僕なら、最初のもの以外は、すべて強烈な関心を持ってその表現を採用した理由を追求します。
>
>

Sub RangeSample()
>    Range("A1:C4").Value = 0
>    Range("A1", "C4").Value = 1
>    Range(Cells(1, 1), Cells(4, 3)).Value = 2
>    Range(Range("A1"), Range("A1").Offset(3, 2)).Value = 3
>    Range(Range("A1").Offset(0, 0), Range("A1").Offset(3, 2)).Value = 4
>    Worksheets("Sheet1").Range("A1:C4").Value = 5
>    Worksheets("Sheet1").Range("A1", "C4").Value = 6
>    Worksheets("Sheet1").Range(Cells(1, 1), Cells(4, 3)).Value = 7
>    Worksheets("Sheet1").Range(Range("A1"), Range("A1").Offset(3, 2)).Value = 8
>    Worksheets("Sheet1").Range(Range("A1").Offset(0, 0), Range("A1").Offset(3, 2)).Value = 9
>End Sub

>
>>これは...関数とマクロで役割分担するのがよいと思っていたのでやってますΣΣ(゚д゚lll)
>>セル内に関数を入れ、関数でカバーできない部分をマクロに組み込んでいました。
>>例えば、VBEに「Range("A11").value="=SUM(A1:A10)"」と入れるべきでしたか。。。
>
>発展編1でお伝えしている内容に即して書くなら、むしろ以下ですね。
>セルに関数が埋め込まれているとエクセルの動きが重たくなりますし、シロウトさんがそこだけいじってメンテナンスしようとするので。
>あと、セルに関数が埋め込まれていると、元データとの結合度が高くて不便です。(配布先でファイルを開こうとするたびに警告される等)
>
>
Sub WsSample()
>    Range("A11").Formula = WorksheetFunction.Sum(Range("A1:A10"))
>End Sub

>
>以下、直接関係ないですが。
>
>僕がよくするアドバイスとして、「完全最適化を目指す遊びは、ゲームとして、演習の中だけで楽しむように」というものがあります。
>
>マクロのパフォーマンスを数%あげるための努力よりも、ムダな常駐ソフトを止めるとかOSを入れ替えるとかPCを変えるとかしたほうがよほど効果がありますし、もっと言えば、時間や集中力は、自分の仕事の専門性を高めるための研究とか一般教養のための読書とか、リフレッシュするためのゆっくりした休暇のために活用するほうが「仕事の質を高めるため」というより上位の目的に対してはよほど寄与するからです。
>
>ゲストさんならご理解いただけるかと思いますが、エクセルのテクニック教えてはいますが、僕がいちばん作りたくないし関わりたくなのは、エクセルしか使えないエクセルバカです。
>
>僕が受講生に期待するのは、くだらない手作業にかかる時間を省略することでできた時間をより人生を有意義なものにするために使って欲しいということです。
>その一環の楽しみとしてコードの最適化を追求するというのは大いにありです。


3835 : 小川慶一の回答 (2015-02-14 08:38:37)

ゲスト さん:

どういうプログラムが優れているのか?という問いの答えは、そのプログラムにどう関わる人にとって?という前提によって変わります。
http://www.exvba.com/blog/?p=4378

ですから一概には言えないですが、複数の道具が出てくる段階でメンテナンス性はイマイチですね。

>仕様書では、同じ概念を表すのに表記がばらばらということはない)

「このプログラムを書いた人がどの表現を採用したか」という情報は、そのマクロを編集する人にとって非常に重要です。
ごく簡単な表現以外知らないという人が書いたのでなければ、必ずそこには意図があるからです。

表現が違えば、抽象概念は共通でも実装は異なります。
たとえば、以下はシート「Sheet1」にある複数セルを選択する表現ですが、すべて実装は異なります。僕なら、最初のもの以外は、すべて強烈な関心を持ってその表現を採用した理由を追求します。

Sub RangeSample()
    Range("A1:C4").Value = 0
    Range("A1", "C4").Value = 1
    Range(Cells(1, 1), Cells(4, 3)).Value = 2
    Range(Range("A1"), Range("A1").Offset(3, 2)).Value = 3
    Range(Range("A1").Offset(0, 0), Range("A1").Offset(3, 2)).Value = 4
    Worksheets("Sheet1").Range("A1:C4").Value = 5
    Worksheets("Sheet1").Range("A1", "C4").Value = 6
    Worksheets("Sheet1").Range(Cells(1, 1), Cells(4, 3)).Value = 7
    Worksheets("Sheet1").Range(Range("A1"), Range("A1").Offset(3, 2)).Value = 8
    Worksheets("Sheet1").Range(Range("A1").Offset(0, 0), Range("A1").Offset(3, 2)).Value = 9
End Sub


>これは...関数とマクロで役割分担するのがよいと思っていたのでやってますΣΣ(゚д゚lll)
>セル内に関数を入れ、関数でカバーできない部分をマクロに組み込んでいました。
>例えば、VBEに「Range("A11").value="=SUM(A1:A10)"」と入れるべきでしたか。。。

発展編1でお伝えしている内容に即して書くなら、むしろ以下ですね。
セルに関数が埋め込まれているとエクセルの動きが重たくなりますし、シロウトさんがそこだけいじってメンテナンスしようとするので。
あと、セルに関数が埋め込まれていると、元データとの結合度が高くて不便です。(配布先でファイルを開こうとするたびに警告される等)

Sub WsSample()
    Range("A11").Formula = WorksheetFunction.Sum(Range("A1:A10"))
End Sub


以下、直接関係ないですが。

僕がよくするアドバイスとして、「完全最適化を目指す遊びは、ゲームとして、演習の中だけで楽しむように」というものがあります。

マクロのパフォーマンスを数%あげるための努力よりも、ムダな常駐ソフトを止めるとかOSを入れ替えるとかPCを変えるとかしたほうがよほど効果がありますし、もっと言えば、時間や集中力は、自分の仕事の専門性を高めるための研究とか一般教養のための読書とか、リフレッシュするためのゆっくりした休暇のために活用するほうが「仕事の質を高めるため」というより上位の目的に対してはよほど寄与するからです。

ゲストさんならご理解いただけるかと思いますが、エクセルのテクニック教えてはいますが、僕がいちばん作りたくないし関わりたくなのは、エクセルしか使えないエクセルバカです。

僕が受講生に期待するのは、くだらない手作業にかかる時間を省略することでできた時間をより人生を有意義なものにするために使って欲しいということです。
その一環の楽しみとしてコードの最適化を追求するというのは大いにありです。


3833 : 佐藤 あゆむさんのコメント (2015-02-14 07:26:49)

小川先生:
指摘ありがとうございます。コードの短さを主眼に追求していました。


>DPRの動画でもお話しているように思いますが、Process最適化のアプローチのひとつは、利用する手段の最適化(最小化)です。
DPRの動画は昨日から見始めました。
確かに仕組みが単純なのは重要ですね。開発で言われる「例外はつくらない」とも重なります。

英語の小説と仕様書では、断然仕様書の方が読みやすいのを連想しました。
(小説では、表現の豊かさやイメージを膨らませるために同じ概念を表すが表記が全く異なる単語や表現がいくつも出てくる。
仕様書では、同じ概念を表すのに表記がばらばらということはない)

>関数とマクロを併用することも非効率だというのと同様です。
>典型的な、デキない子の仕事のやり方です。
これは...関数とマクロで役割分担するのがよいと思っていたのでやってますΣΣ(゚д゚lll)
セル内に関数を入れ、関数でカバーできない部分をマクロに組み込んでいました。
例えば、VBEに「Range("A11").value="=SUM(A1:A10)"」と入れるべきでしたか。。。
そうすると、関数を修正するときや、シートのどこに関数が入っているかを探すときにウインドウを切り替えずに済みますねヽ(*´v`*)ノ

発展編1に進むのが楽しみです(pq´v`*)

>ゲスト さん:
>
>> RangeとCellsのいいとこどりで書いてみました
>
>やめたほうがよいです。
>
>DPRの動画でもお話しているように思いますが、Process最適化のアプローチのひとつは、利用する手段の最適化(最小化)です。
>
>ひとつの仕事でLotus123とエクセルを併用することも関数とマクロを併用することも非効率だというのと同様です。
>典型的な、デキない子の仕事のやり方です。ゲストさんのような方の採るべきアプローチではありません。
>
>この課題は、発展編1の知識があればもっとさくさくと解決します。


3824 : 小川慶一の回答 (2015-02-13 06:33:24)

ゲスト さん:

> RangeとCellsのいいとこどりで書いてみました

やめたほうがよいです。

DPRの動画でもお話しているように思いますが、Process最適化のアプローチのひとつは、利用する手段の最適化(最小化)です。

ひとつの仕事でLotus123とエクセルを併用することも関数とマクロを併用することも非効率だというのと同様です。
典型的な、デキない子の仕事のやり方です。ゲストさんのような方の採るべきアプローチではありません。

この課題は、発展編1の知識があればもっとさくさくと解決します。


3809 : 佐藤 あゆむさんのコメント (2015-02-11 19:31:40)

今フォローアップ動画9回目から復習をしています。

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


3789 : 小川慶一の回答 (2015-02-10 06:38:54)

匿名 さん:

よろしく。あとは、なぞってでも、自分で書いてみることです。


>今回は、自力で解けませんでした。
>解説動画を何度か繰り返し観たり、正解のコードを眺めながら、構造を理解していきたいです。


3783 : 受講生さんのコメント (2015-02-09 07:34:40)

今回は、自力で解けませんでした。
解説動画を何度か繰り返し観たり、正解のコードを眺めながら、構造を理解していきたいです。


3767 : 小川慶一の回答 (2015-02-07 20:34:41)

ゲスト さん:

>(長々と話せなかったので、「どう言ったら最短最小の言葉でわかってもらえるか」というのが至上命題でした)

なるほど、興味深いです。

「言語の勉強だ」という視点を徹底するとゲストさんのような方は上達早いでしょうね。

壁にぶつかったときは、「自然言語を習得する過程で似たようなことがあったとき、場合どうしたか?」という問いを持つと早いかと思います。

いまさらですし、もう気づかれているかとは思いますが。
釈迦に説法まで。


3756 : 佐藤 あゆむさんのコメント (2015-02-07 17:30:59)

小川先生:

ありがとうございます、語学や言語運用に興味があります。英語は人生の恩人ですし、言語運用は、小学生のころから考えていました。
(長々と話せなかったので、「どう言ったら最短最小の言葉でわかってもらえるか」というのが至上命題でした)


そう言われると確かに、私がマクロを書くときは一つの方法を思いつき、それでちゃんと動かせる自信があれば、ほかのやり方を模索せずにマクロを書きあげます。
(思いつけたら嬉しい。「ほかにもいいやりかたがあるんじゃないか」と思いつつも思いつかない。それが意図したとおりに動けば大満足な段階なので)

まだ小川先生みたいに複数のやり方を思いつき、その中から状況に合ったものを選ぶ、という段階には達していないんですね。和英翻訳とおなじようなレベルアップの仕方だと理解しました。(翻訳の初学のころは、自分で書けるとどれだけダメだしされても、「自力で書けた」ことを嬉しいと思っていました。今は複数ある表現からどれを選ぼうか、などと逡巡するレベルになっています)

>ゲスト さん:
>
>よいアルゴリズムを手に入れることが肝心です。
>
>自然言語でも、「意思疎通できればいいのか」というとそうでもなく、「論説の構成」とか、「冗長性を排除した語彙選択」といったことも大切です。
>「論説の構成」に相当するのがアルゴリズムですね。ゲストさんの言葉を借りれば、「発想」の部分です。
>
>基礎編では、扱う語彙も文法も極限まで減らしています。
>その代わり、演習を通じて、代表的なアルゴリズムとそのアルゴリズムを Visual Basic という言語で実装するまでの手順を習得します。
>
>語彙、文法の知識はそれからつけたほうがよい。
>ということで、そっちの話は発展編1以降で扱います。
>
>..と。
>いつもならだいたいこのくらいでコメント終わりにしているのですが。
>
>ゲストさんは語学とか言語運用とかへの関心の高い方なので、もう少し。
>
>冗長性排除の例を以下にひとつ示します。
>
>

'Before
>Sub hogebefore()
>	Range("A2").Value = 2
>	Range("A3").Value = 3
>	Range("A4").Value = 4
>	Range("A5").Value = 5
>	Range("A6").Value = 6
>	Range("A7").Value = 7
>	Range("A8").Value = 8
>	Range("A9").Value = 9
>End Sub
>
>'After
>Sub hogeafter()
>	Dim c
>	For c = 2 To 9
>		Range("A" & c).Value = c
>	Next
>End Sub

>
>以下は、語彙、文法の選択の例。
>例えば、以下の4つのプログラムは最終的に実施される作業はほぼ同じですが、語彙の選択によって結果が変わっています。
>tenki4 のプログラムは、文法もこれまでに使っていないものです。
>
>
Sub tenki1()
>    Range("A14").Value = Range("A3").Value
>    Range("B14").Value = Range("B3").Value
>    Range("C14").Value = Range("C3").Value
>    Range("D14").Value = Range("D3").Value
>    Range("E14").Value = Range("E3").Value
>    Range("F14").Value = Range("F3").Value
>    Range("G14").Value = Range("G3").Value
>    Range("H14").Value = Range("H3").Value
>    Range("I14").Value = Range("I3").Value
>    Range("J14").Value = Range("J3").Value
>End Sub
>Sub tenki2()
>    Dim c
>    For c = 0 To 9
>        Range("A14").Offset(, c).Value = Range("A3").Offset(, c).Value
>    Next
>End Sub
>Sub tenki3()
>    Range("A14:J14").Value = Range("A3:J3").Value
>End Sub
>Sub tenki4()
>    Range("A3:J3").Copy
>    Range("A14").PasteSpecial Paste:=xlPasteValues
>End Sub

>
>上記のサンプルのいずれも使う可能性があります。
>
>僕の好みは tenki3 の書き方です。
>ですが、tenki4 をもう少し拡張して行全体をコピーという記載にすると、コピーする範囲に変動があった場合もこの部分はメンテナンスしなくて済む。
>tenki1 の書き方は、僕が書くのではなく、プログラミング初心者/(タイピングの早さ正確さを含めて)言語運用能力がまだあまり高くない人に実際にプログラミングを体験してもらうという段においてはとてもよい書き方です。
>tenki2 の書き方も、体験用。 hogeafter の書き方に十分に慣れてもらってから示します。言語運用能力がもともと高い人の場合はすぐにでも教えられますが、そうでなければ、最低でも基礎編フォロー動画のうち半分くらいは自力でやってもらってからですね。
>
>コピー元/貼りつけ先のセルが結合されていたりしたら、さらにややこしいことをまた考える必要があります。
>(基礎編レベルの人にそこまで考えて使う手法を選択しろというのは酷な話なんで、講座本編としてはこんな話は決してしませんが)
>
>
>>これまで何とか自分で解けていますが、動画の解答と比べると原始的な発想なので勉強になります。
>>18回目まで行ったら、第9回からもう一度復習します^^
>


3741 : 小川慶一の回答 (2015-02-05 07:53:37)

ゲスト さん:

よいアルゴリズムを手に入れることが肝心です。

自然言語でも、「意思疎通できればいいのか」というとそうでもなく、「論説の構成」とか、「冗長性を排除した語彙選択」といったことも大切です。
「論説の構成」に相当するのがアルゴリズムですね。ゲストさんの言葉を借りれば、「発想」の部分です。

基礎編では、扱う語彙も文法も極限まで減らしています。
その代わり、演習を通じて、代表的なアルゴリズムとそのアルゴリズムを Visual Basic という言語で実装するまでの手順を習得します。

語彙、文法の知識はそれからつけたほうがよい。
ということで、そっちの話は発展編1以降で扱います。

..と。
いつもならだいたいこのくらいでコメント終わりにしているのですが。

ゲストさんは語学とか言語運用とかへの関心の高い方なので、もう少し。

冗長性排除の例を以下にひとつ示します。

'Before
Sub hogebefore()
	Range("A2").Value = 2
	Range("A3").Value = 3
	Range("A4").Value = 4
	Range("A5").Value = 5
	Range("A6").Value = 6
	Range("A7").Value = 7
	Range("A8").Value = 8
	Range("A9").Value = 9
End Sub

'After
Sub hogeafter()
	Dim c
	For c = 2 To 9
		Range("A" & c).Value = c
	Next
End Sub


以下は、語彙、文法の選択の例。
例えば、以下の4つのプログラムは最終的に実施される作業はほぼ同じですが、語彙の選択によって結果が変わっています。
tenki4 のプログラムは、文法もこれまでに使っていないものです。

Sub tenki1()
    Range("A14").Value = Range("A3").Value
    Range("B14").Value = Range("B3").Value
    Range("C14").Value = Range("C3").Value
    Range("D14").Value = Range("D3").Value
    Range("E14").Value = Range("E3").Value
    Range("F14").Value = Range("F3").Value
    Range("G14").Value = Range("G3").Value
    Range("H14").Value = Range("H3").Value
    Range("I14").Value = Range("I3").Value
    Range("J14").Value = Range("J3").Value
End Sub
Sub tenki2()
    Dim c
    For c = 0 To 9
        Range("A14").Offset(, c).Value = Range("A3").Offset(, c).Value
    Next
End Sub
Sub tenki3()
    Range("A14:J14").Value = Range("A3:J3").Value
End Sub
Sub tenki4()
    Range("A3:J3").Copy
    Range("A14").PasteSpecial Paste:=xlPasteValues
End Sub


上記のサンプルのいずれも使う可能性があります。

僕の好みは tenki3 の書き方です。
ですが、tenki4 をもう少し拡張して行全体をコピーという記載にすると、コピーする範囲に変動があった場合もこの部分はメンテナンスしなくて済む。
tenki1 の書き方は、僕が書くのではなく、プログラミング初心者/(タイピングの早さ正確さを含めて)言語運用能力がまだあまり高くない人に実際にプログラミングを体験してもらうという段においてはとてもよい書き方です。
tenki2 の書き方も、体験用。 hogeafter の書き方に十分に慣れてもらってから示します。言語運用能力がもともと高い人の場合はすぐにでも教えられますが、そうでなければ、最低でも基礎編フォロー動画のうち半分くらいは自力でやってもらってからですね。

コピー元/貼りつけ先のセルが結合されていたりしたら、さらにややこしいことをまた考える必要があります。
(基礎編レベルの人にそこまで考えて使う手法を選択しろというのは酷な話なんで、講座本編としてはこんな話は決してしませんが)


>これまで何とか自分で解けていますが、動画の解答と比べると原始的な発想なので勉強になります。
>18回目まで行ったら、第9回からもう一度復習します^^


3737 : 佐藤 あゆむさんのコメント (2015-02-04 22:46:46)

これまで何とか自分で解けていますが、動画の解答と比べると原始的な発想なので勉強になります。
18回目まで行ったら、第9回からもう一度復習します^^


3616 : 小川慶一の回答 (2015-01-15 12:30:35)

ライスミルク さん:

>*お団子作る
> ① 兄さんお団子:最高点を特定する
> ② 次男お団子: 特定したところに、「最高点です」を入れる。

何を言っているのかもはやよく分からないですがw

工程をきちんと守って作業されているなら、大丈夫です。
「ハナコ」は僕のオリジナルのメタファです。
ご自身でご自由に解釈していただければとも。





>小川先生
>
> ありがとうございます。
> はい、動画を拝見して、その分が余計だと分かりました。
>(書いたり消したり)
>
>>>という、お団子2個 作ることが、勉強になりました。
> 現在、
>
>*お団子作る
> ① 兄さんお団子:最高点を特定する
> ② 次男お団子: 特定したところに、「最高点です」を入れる。
>
>↓
>箱の蓋
> 兄さんお団子:最高点を特定する
>箱のそこ
> 次男お団子: 特定したところに、「最高点です」を入れる。
>
>という 認識ですが、よろしいでしょうか。
>
>>ライスミルク さん:
>>
>>いただいたコードだと、現時点での王者が入れ替わる都度、以下の2行が実行されます。
>>これがムダですね。ループを抜けたあとの1回だけにしたいです。
>>
>> Range("J" & gyo) = "最高点です"
>> Range("j2:H" & gyo - 1) = ""
>

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

>>
>>
>>>小川先生
>>>
>>> 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]
>


3610 : 山本 茂生さんのコメント (2015-01-14 12:47:03)

小川先生

 ありがとうございます。
 はい、動画を拝見して、その分が余計だと分かりました。
(書いたり消したり)

>>という、お団子2個 作ることが、勉強になりました。
 現在、

*お団子作る
 ① 兄さんお団子:最高点を特定する
 ② 次男お団子: 特定したところに、「最高点です」を入れる。


箱の蓋
 兄さんお団子:最高点を特定する
箱のそこ
 次男お団子: 特定したところに、「最高点です」を入れる。

という 認識ですが、よろしいでしょうか。

>ライスミルク さん:
>
>いただいたコードだと、現時点での王者が入れ替わる都度、以下の2行が実行されます。
>これがムダですね。ループを抜けたあとの1回だけにしたいです。
>
> Range("J" & gyo) = "最高点です"
> Range("j2:H" & gyo - 1) = ""

>

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

>
>
>>小川先生
>>
>> 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]


3605 : 小川慶一の回答 (2015-01-13 18:04:56)

ライスミルク さん:

いただいたコードだと、現時点での王者が入れ替わる都度、以下の2行が実行されます。
これがムダですね。ループを抜けたあとの1回だけにしたいです。

Range("J" & gyo) = "最高点です"
Range("j2:H" & gyo - 1) = ""




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



>小川先生
>
> 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]
>


3592 : 山本 茂生さんのコメント (2015-01-13 09:54:49)

小川先生

 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]


2603 : 小川慶一の回答 (2014-10-01 04:27:55)

匿名 さん:

よくできていると思います。

>この部分はCellsを使った方が断然楽だと思いました。

ここは好みですね。
でも、ほかを Range で書いているから、統一性という意味で言うと Range で書いたほうがよいかな、とも思います。

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



>小川先生:
>
>>あとは、offsetを使うことですね。
>ということですので、Offsetを使った例を考えてみました。
>
>Sub mondai3_offset()
> Dim i As Long, j As Long, Max As Single, r As Long, c As Long
> For i = 0 To 27
> For j = 0 To 5
> If Max < Range("C6").Offset(i, j) Then
> Max = Range("C6").Offset(i, j)
> r = i
> c = j
> End If
> Next j
> Next i
> Range("K4").Value = Range("B" & r + 6).Value
> Range("L4").Value = Range("C6").Offset(-1, c)
> Range("M4").Value = Max
>End Sub
>
>今回は最後にセルへ代入する部分も、あえてCellsを使わないでやってみましたが、
>この部分はCellsを使った方が断然楽だと思いました。
>Cellsを使わずに横にループする方法もあることが分かってよかったです。
>
>>匿名 さん:
>>
>>>数値型と違い、Range型はセルそのものを参照するため、行数や列数を管理する変数を
>>>別に用意しなくてもいいのですね。
>>>また、初期値がNothingであるため、暫定勝者の設定が必要。
>>>オブジェクト型であるため、代入する時にはSetが必要(If文の箇所)。
>>>という認識でよろしいでしょうか?
>>
>>OKです。
>>
>>以下のコードもシンプルでとてもよいですね (^^
>>

Sub mondai3_For_Each()
>>    Dim rng As Range, Max As Range
>>    Set Max = Range("C6")
>>    For Each rng In Range("C6:H33")
>>        If Max.Value < rng.Value Then
>>            Set Max = rng
>>        End If
>>    Next rng
>>    Cells(4, "K").Value = Cells(Max.Row, 2).Value
>>    Cells(4, "L").Value = Cells(5, Max.Column).Value
>>    Cells(4, "M").Value = Max.Value
>>End Sub

>>
>>>今までこのようなケースでは、For ~ Nextのネストしか思いつかなかったため、Cellsを使わない場合は
>>>どうするのだろうと思っていたのですが、
>>
>>あとは、offsetを使うことですね。
>>
>


2599 : 受講生さんのコメント (2014-09-30 20:22:23)

小川先生:

>あとは、offsetを使うことですね。
ということですので、Offsetを使った例を考えてみました。

Sub mondai3_offset()
Dim i As Long, j As Long, Max As Single, r As Long, c As Long
For i = 0 To 27
For j = 0 To 5
If Max < Range("C6").Offset(i, j) Then
Max = Range("C6").Offset(i, j)
r = i
c = j
End If
Next j
Next i
Range("K4").Value = Range("B" & r + 6).Value
Range("L4").Value = Range("C6").Offset(-1, c)
Range("M4").Value = Max
End Sub

今回は最後にセルへ代入する部分も、あえてCellsを使わないでやってみましたが、
この部分はCellsを使った方が断然楽だと思いました。
Cellsを使わずに横にループする方法もあることが分かってよかったです。

>匿名 さん:
>
>>数値型と違い、Range型はセルそのものを参照するため、行数や列数を管理する変数を
>>別に用意しなくてもいいのですね。
>>また、初期値がNothingであるため、暫定勝者の設定が必要。
>>オブジェクト型であるため、代入する時にはSetが必要(If文の箇所)。
>>という認識でよろしいでしょうか?
>
>OKです。
>
>以下のコードもシンプルでとてもよいですね (^^
>

Sub mondai3_For_Each()
>    Dim rng As Range, Max As Range
>    Set Max = Range("C6")
>    For Each rng In Range("C6:H33")
>        If Max.Value < rng.Value Then
>            Set Max = rng
>        End If
>    Next rng
>    Cells(4, "K").Value = Cells(Max.Row, 2).Value
>    Cells(4, "L").Value = Cells(5, Max.Column).Value
>    Cells(4, "M").Value = Max.Value
>End Sub

>
>>今までこのようなケースでは、For ~ Nextのネストしか思いつかなかったため、Cellsを使わない場合は
>>どうするのだろうと思っていたのですが、
>
>あとは、offsetを使うことですね。
>


2592 : 小川慶一の回答 (2014-09-30 10:39:12)

匿名 さん:

>数値型と違い、Range型はセルそのものを参照するため、行数や列数を管理する変数を
>別に用意しなくてもいいのですね。
>また、初期値がNothingであるため、暫定勝者の設定が必要。
>オブジェクト型であるため、代入する時にはSetが必要(If文の箇所)。
>という認識でよろしいでしょうか?

OKです。

以下のコードもシンプルでとてもよいですね (^^

Sub mondai3_For_Each()
    Dim rng As Range, Max As Range
    Set Max = Range("C6")
    For Each rng In Range("C6:H33")
        If Max.Value < rng.Value Then
            Set Max = rng
        End If
    Next rng
    Cells(4, "K").Value = Cells(Max.Row, 2).Value
    Cells(4, "L").Value = Cells(5, Max.Column).Value
    Cells(4, "M").Value = Max.Value
End Sub


>今までこのようなケースでは、For ~ Nextのネストしか思いつかなかったため、Cellsを使わない場合は
>どうするのだろうと思っていたのですが、

あとは、offsetを使うことですね。


2586 : 受講生さんのコメント (2014-09-30 01:11:45)

小川先生:

Range型を使用し、書きなおしてみました。
Sub mondai3_For_Each()
Dim rng As Range, Max As Range
Set Max = Range("C6")
For Each rng In Range("C6:H33")
If Max.Value < rng.Value Then
Set Max = rng
End If
Next rng
Cells(4, "K").Value = Cells(Max.Row, 2).Value
Cells(4, "L").Value = Cells(5, Max.Column).Value
Cells(4, "M").Value = Max.Value
End Sub

数値型と違い、Range型はセルそのものを参照するため、行数や列数を管理する変数を
別に用意しなくてもいいのですね。
また、初期値がNothingであるため、暫定勝者の設定が必要。
オブジェクト型であるため、代入する時にはSetが必要(If文の箇所)。
という認識でよろしいでしょうか?

今までこのようなケースでは、For ~ Nextのネストしか思いつかなかったため、Cellsを使わない場合は
どうするのだろうと思っていたのですが、今回For ~ Eachの新たな使い方を発見できました。


>匿名 さん:
>
>>変数MaxはRange型の方が良かったのでしょうか?
>
>試してないですが、Range型にしてセルへの参照をそのまま利用したほうがよさそうですね。
>
>>また、このような問題の場合は、For ~ NextとCellsを使ってネストさせるより、For ~ Eachを使った方がいいのでしょうか?
>
>For Each構文のほうが僕の好みです
>理由は、以下の2つ:
>
>[1] 構造が少ない
>[2] For Each構文はコレクション指定した段階でコレクションのメンバーすべてへの参照がメモリに読み込まれるので高速
>
>もっとも、常に確実に For Each 構文を使うほうがよいかというと、そうでもありません。
>理由は以下にて。
>http://www.exvba.com/blog/?p=4378
>
>
>>小川先生
>>問題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
>


2577 : 小川慶一の回答 (2014-09-29 13:22:36)

匿名 さん:

>変数MaxはRange型の方が良かったのでしょうか?

試してないですが、Range型にしてセルへの参照をそのまま利用したほうがよさそうですね。

>また、このような問題の場合は、For ~ NextとCellsを使ってネストさせるより、For ~ Eachを使った方がいいのでしょうか?

For Each構文のほうが僕の好みです
理由は、以下の2つ:

[1] 構造が少ない
[2] For Each構文はコレクション指定した段階でコレクションのメンバーすべてへの参照がメモリに読み込まれるので高速

もっとも、常に確実に For Each 構文を使うほうがよいかというと、そうでもありません。
理由は以下にて。
http://www.exvba.com/blog/?p=4378


>小川先生
>問題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


2570 : 受講生さんのコメント (2014-09-28 10:14:51)

小川先生
問題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


1909 : 小川慶一の回答 (2014-08-11 16:06:53)

明石 照伸 さん:

>自分のできることから出発することで
>一見手も足も出ない問題に対しても何らかの取っ掛かり
>が見えてくるかもしれないと思いました。

ですね。それがすべてです。


1883 : 明石 照伸さんのコメント (2014-08-09 12:39:34)


お世話になります。

今回、最後の問題で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

=====


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

北嶋さん:

> 今回の課題ではやたらとFor文を使ってしまい、また力技でやってしまって、もう少しスマートに書きたいなぁと思っていました。

力業でもやりきれればたいしたもんです。

> 基礎講座で学んだ範囲で今回の課題を解こうとすると若干複雑になってしまうということでしょうか。

ですね ^^;

「エクセル関数」と「マクロ」くらい違うと思います (^^;;;;;

限られた道具だけでなんとかやりきれる力がついてからだと、テクニック的なことを学んだときの感動も大きいです。

発展編が楽しみですね☆


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

小俣さん:

おー、 Cells ですか。よく見つけましたね!確実に、力がついてきているということかと思います!
ちなみに、発展編でも同じ課題を扱いますが、 Cells とはまた違う方法で解決します。お楽しみに☆


373 : 北嶋浩行さんのコメント (2013-09-08 00:01:00)

今回の課題ではやたらとFor文を使ってしまい、また力技でやってしまって、もう少しスマートに書きたいなぁと思っていました。
でも、発展編ではもっとシンプルに書ける構文(?)が出てくるんですね。
基礎講座で学んだ範囲で今回の課題を解こうとすると若干複雑になってしまうということでしょうか。


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

勝ち抜き戦の基本パターンは実務で頻出ですよね。
これまでの応用できっちり書くことができました。

NO3は列数もForループさせるともっと楽に書けそうな気がしたのでCellsプロパティを使ってみました。

Sub test10()
    Dim gyo '行カウンター
    Dim retu '列カウンター
    Dim saikou_g 'チャンピオンの行数を保持する変数
    Dim saikou_r 'チャンピオンの列数を保持する変数
     
    saikou_g = 6 '暫定チャンピオン
    saikou_r = 3 '暫定チャンピオン
     
    For retu = 3 To 9 'C列~H列まで繰り返す
        For gyo = 6 To 33 '6行~33行まで繰り返す
            If Cells(gyo, retu).Value > Cells(saikou_g, saikou_r).Value Then '暫定チャンピオンより挑戦者が大きい場合
                saikou_g = gyo '暫定チャンピオンの行数を更新する
                saikou_r = retu '暫定チャンピオンの列数を更新する
            End If
        Next
    Next
    Range("K4").Value = Range("B" & saikou_g).Value
    Range("L4").Value = Cells(5, saikou_r).Value
    Range("M4").Value = Cells(saikou_g, saikou_r).Value
End Sub


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

平井さん:

OSが弱っているのか、エクセルが弱っているのか。。
いずれにしても、そのマシンに固有の問題ぽいですね。

また、何か分かったり新たな疑問が生じたりしたら、お知らせください!


370 : 平井孝代さんのコメント (2013-07-16 00:03:00)

Windows7でやってみました。
他のマシンではすんなりできました。
びっくりです。
エクセルを再インストールする必要がありそうですね。
そういえばマクロを書いていてどうしてもわからないエラーが出て書き直すと動くようなこともあったような気がします。


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

平井さん:

> 最近エクセル作業中に再起動が起きていて、不安定な状態でもあります。

てことだと、別のマシンでも同じことになるのか?とかはいちおう確認してみたい気もします。

手元に、他のマシンはありますか?


368 : 平井孝代さんのコメント (2013-07-16 00:01:00)

数字が入っていたセルを誤って空欄にしてしまった場所がkatiになってしまった現象です。

状況は、ウィンドウズ8、エクセル2013、zipファイルを展開しない状態でファイルを開き、マクロを動かしていたら誤動作がおきました。

展開したあと同様の状態でマクロを動かしてみたところ、誤動作は起きませんでした。

最近エクセル作業中に再起動が起きていて、不安定な状態でもあります。

とりあえず今後は手を抜かずに展開して使ってみます。


367 : ガラパゴスタディー事務局の回答 (2013-07-16 00:00:00)

平井さん:

> 圧縮を解凍したものに同じマクロを使ったら再現せず正しく動きました。
> 圧縮されたフォルダーのまま展開せずに使っていたせいで起きた現象なのではないかと思うのですがいかがでしょうか?

↑上記の仮説が正しいかどうかを検証する環境を作り、そこでご自身でテストをしてみてください。

どんな環境を作り、どんなテストをしたか分かるようお知らせください。

必要そうでしたら、ファイル送ってください。よろしく、お願いいたします。


366 : 平井孝代さんのコメント (2013-07-15 00:02:00)

コメントありがとうございます。
ファイルを送ろうとして再現しました。
圧縮を解答したものに同じマクロを使ったら再現せず正しく動きました。

圧縮されたフォルダーのまま展開せずに使っていたせいで起きた現象なのではないかと思うのですがいかがでしょうか?

必要ならファイルをおくります。


365 : ガラパゴスタディー事務局の回答 (2013-07-15 00:01:00)

平井さん:

ファイル送ってください。見てみます。


364 : 平井孝代さんのコメント (2013-07-15 00:00:00)

なぜかkatiの人の名前でなく31行目の人の名前が入ってしまっておかしいなと思いシートの確認をしたところ、シート2の"C3"1のセルに入っている-を誤って消してしまい、セルの内容が空欄になっていました。

なぜ30のままであるべきkatiの値が31に変わってしまったのでしょうか?
又、空欄が入っていても問題なく動かすにはどうしたらよいのでしょうか?


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

やまださん:

> つい今まで(マクロを使わないエクセル)の延長上で「エクセルシートに結果が反映されること」ばかりを意識していた気がします。

最終的に結果を出せる自信がつけば、途中経過を表示したいという意識は自然に消えていくかと思います。

あとは、「どちらのほうが美しいだろうか」という美意識のようなところでしょうか。

美しさとは、たとえば可読性、高速性、処理のシンプルさ等です。


362 : やまださんのコメント (2013-07-07 00:00:00)

小川先生

なるほど。。もうすこし「変数」を扱うことに慣れた方がいい気がしてきました。つい今まで(マクロを使わないエクセル)の延長上で「エクセルシートに結果が反映されること」ばかりを意識していた気がします。
もうすこし「マクロの世界」の考え方に身を任せた方がいいかもしれません。まだ「通常のエクセルの世界」にしがみついている感じです。


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

やまださん:

変数に値を格納することのほうが、セルに値を書き込むことより処理が高速です。
そういう意味で言うと、変数に値を書き込むほうがよいです。

> エクセルシートに反映された方がマクロの結果がすぐに確認できていいかと思って

その目的は、以下で代替できるかと思います。

[1] コード上で、変数の値を上書きする部分(またはその直後)にブレークポイントを入れる

[2] ブレークポイントで動作が止まる都度、マウスをあてて、その変数に入った値を確認する

いただいたコード、インデントは直したいです。
でも、よく書けていると思います。


360 : やまださんのコメント (2013-07-03 00:00:00)

3ですが、F8を押していった結果がすぐエクセルシートに反映された方がマクロの結果がすぐに確認できていいかと思って次のようなマクロにしてみました。構いませんでしょうか?

Sub mondai3()
 
Dim gyo
Dim retsu
Dim kati
kati = 6
retsu = "c"
 
For gyo = 6 To 33
    If Range(retsu & kati) < Range("c" & gyo) Then
        retsu = "C"
        kati = gyo
    End If
        Range("K4") = Range("B" & kati)
        Range("l4") = Range(retsu & 5)
        Range("m4") = Range(retsu & kati)
Next
 
For gyo = 6 To 33
    If Range(retsu & kati) < Range("d" & gyo) Then
        retsu = "d"
        kati = gyo
    End If
        Range("K4") = Range("B" & kati)
        Range("l4") = Range(retsu & 5)
        Range("m4") = Range(retsu & kati)
Next
 
 
For gyo = 6 To 33
    If Range(retsu & kati) < Range("e" & gyo) Then
        retsu = "e"
        kati = gyo
    End If
        Range("K4") = Range("B" & kati)
        Range("l4") = Range(retsu & 5)
        Range("m4") = Range(retsu & kati)
Next
For gyo = 6 To 33
    If Range(retsu & kati) < Range("f" & gyo) Then
        retsu = "f"
        kati = gyo
    End If
        Range("K4") = Range("B" & kati)
        Range("l4") = Range(retsu & 5)
        Range("m4") = Range(retsu & kati)
Next
For gyo = 6 To 33
    If Range(retsu & kati) < Range("g" & gyo) Then
        retsu = "g"
        kati = gyo
    End If
        Range("K4") = Range("B" & kati)
        Range("l4") = Range(retsu & 5)
        Range("m4") = Range(retsu & kati)
Next
For gyo = 6 To 33
    If Range(retsu & kati) < Range("h" & gyo) Then
        retsu = "h"
        kati = gyo
    End If
        Range("K4") = Range("B" & kati)
        Range("l4") = Range(retsu & 5)
        Range("m4") = Range(retsu & kati)
Next
     
End Sub


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

池本さん:

良かったです (^^*

いろいろやり方あります。発展編では、もっと簡単に解決する方法を学びます。
お楽しみに!


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

おはようございます♪

みえてなかった、ありがとうございます~☆
比べてないから勝ち抜けないマクロでした(^^;)

day12の学習、
勝ち抜き戦勝者の変数ととりあえずスタートの値をきめて
範囲の値を1個ずつ比べて勝ち抜きの値を出すパターン、
クリアしました~☆ 

先生の答えみてやりなおしたマクロ↓ 動画みないでできた!

Sub saikoten()
    Dim kati
    kati = 2
    Dim gyo
    For gyo = 2 To 11
        If Range("G" & kati).Value < Range("G" & gyo).Value Then
        kati = gyo
        End If
    Next
    Range("J" & kati).Value = "最高点です"
     
End Sub
 
Sub enero()
    Dim max
    max = 6
    Dim gyo
    For gyo = 6 To 33
        If Range("C" & max).Value < Range("C" & gyo) Then
        max = gyo
        End If
         
    Next
        Range("K4").Value = Range("B" & max)
        Range("L4").Value = Range("C5")
        Range("M4").Value = Range("C" & max)
         
End Sub
 
Sub kamihan()
    Dim kati
    Dim retsu
    kati = 6
    retsu = "C"
    Dim gyo
    For gyo = 6 To 33
        If Range(retsu & kati).Value < Range(retsu & gyo).Value Then
        kati = gyo
        retsu = "C"
        End If
    Next
     
    For gyo = 6 To 33
        If Range(retsu & kati).Value < Range("D" & gyo).Value Then
        kati = gyo
        retsu = "D"
        End If
    Next
     
    For gyo = 6 To 33
        If Range(retsu & kati).Value < Range("E" & gyo).Value Then
        kati = gyo
        retsu = "E"
        End If
    Next
    For gyo = 6 To 33
        If Range(retsu & kati).Value < Range("F" & gyo).Value Then
        kati = gyo
        retsu = "F"
        End If
    Next
     
    For gyo = 6 To 33
        If Range(retsu & kati).Value < Range("G" & gyo).Value Then
        kati = gyo
        retsu = "G"
        End If
    Next
     
    For gyo = 6 To 33
        If Range(retsu & kati).Value < Range("H" & gyo).Value Then
        kati = gyo
        retsu = "H"
        End If
    Next
        Range("K4").Value = Range("B" & kati).Value
        Range("L4").Value = Range(retsu & 5).Value
        Range("M4").Value = Range(retsu & kati).Value
         
End Sub


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

池本さん:

    For gyo = 6 To 33'    If Range(retsu & gyo).Value < Range("C" & gyo).Value Then        If Range(retsu & kati).Value < Range("C" & gyo).Value Then            retsu = "C"            kati = gyo        End If    Next


356 : 池本利恵さんのコメント (2013-04-15 00:01:00)

あら?!今投稿したものend subが2つになってました。
1つ削除します。

Sub katinukisen()
 
    Dim retsu
    Dim kati
    retsu = "C"
    kati = 6
    Dim gyo
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("C" & gyo).Value Then
    retsu = "C"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("D" & gyo).Value Then
    retsu = "D"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("E" & gyo).Value Then
    retsu = "E"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("F" & gyo).Value Then
    retsu = "F"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("G" & gyo).Value Then
    retsu = "G"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("H" & gyo).Value Then
    retsu = "H"
    kati = gyo
    End If
    Next
 
Range("K4").Value = Range("B" & kati).Value
Range("L4").Value = Range(retsu & 5).Value
Range("M4").Value = Range(retsu & kati).Value
 
 
End Sub


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

おはようございます♪

問題3でかいたマクロです。
どこが間違っているかわからないので教えてください。

Sub katinukisen()
 
End Sub
    Dim retsu
    Dim kati
    retsu = "C"
    kati = 6
    Dim gyo
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("C" & gyo).Value Then
    retsu = "C"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("D" & gyo).Value Then
    retsu = "D"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("E" & gyo).Value Then
    retsu = "E"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("F" & gyo).Value Then
    retsu = "F"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("G" & gyo).Value Then
    retsu = "G"
    kati = gyo
    End If
    Next
     
    For gyo = 6 To 33
    If Range(retsu & gyo).Value < Range("H" & gyo).Value Then
    retsu = "H"
    kati = gyo
    End If
    Next
 
Range("K4").Value = Range("B" & kati).Value
Range("L4").Value = Range(retsu & 5).Value
Range("M4").Value = Range(retsu & kati).Value
 
 
End Sub


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

星野さん:

この問題、けっこう難しいですよ。
順調そうで、何より☆


353 : 星野智幸さんのコメント (2013-03-23 00:00:00)

2月に受講した星野です。
ただいま2周目です。
スムーズにとけて少し成長を実感しました。


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

豊島さん:

すいません。お返事落ちていました。

とはいえ、順調そうでなにより (^^;


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

3番の問題でつまづき、3回、解説の動画を見て、やっとマクロが空で書けるようになりました。


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

山根さん:

3問目は、むりやり For Next と If で解いていますが、それは、この講座が基礎編のフォロー動画だからです。

発展編レベルの知識があればあっさり解決しますので、その様式で考えてみてください。


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

3問目は解けませんでした。
動画を拝見すると列を変数に入れて比較していくとは。
2問目はこんな感じでした。
3問目を今から復習します。

Sub Q2()
    Dim zan As Long
    Dim i As Long
    zan = 7
    For i = 6 To 33
        If Range("c" & i).Value > Range("c" & zan).Value Then
            zan = i
        End If
    Next
    Range("k4").Value = Range("b" & zan).Value
    Range("l4").Value = Range("c5").Value
    Range("m4").Value = Range("c" & zan).Value
End Sub


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

佐藤さん:

何度もトライされるその姿勢、本当にすばらしいです!

> 最後のところで行はそのままに列を順々に調べていくのを見て、やっとそのことに気が付きました。

変数の値が変わるタイミングの前から変数の上にマウスをかぶせておき(自動データヒント機能を使う)、
一行一行[F8]で進めていきながら、いつ、どのタイミングで変数の値が切り替わるかを確認するとよいです。

切り替わりの前後に注目し、何がどのタイミングで変化しているのか、を意識することが大切です。


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

for next 構文はnextが出てくるまで次の変数にいかないのですね
最後のところで行はそのままに列を順々に調べていくのを見て、やっとそのことに気が付きました。
今さらですが・・。


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

佐藤さん:

もっとカッコいい方法もあるんですけどね。
基礎編ということで、今回は、手元の道具をつかってベタにやる方法をご紹介しています。


345 : 佐藤 尚子さんのコメント (2012-11-28 00:00:00)

動きました♪
本当に「勝ち抜き」なんですね。
一番大きい数字を探す、と考えていたら、思いつきませんでした。
考え方が参考になりました。


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

おはようございます。

> 動画を見て少し力が湧いて来ました。KATIとgyoを戦わせるんだ~、と楽しくなりました。

そうそう。そういう感覚。
お相撲さんが勝ち抜き戦をしている、とか、そんなシーンをイメージしてください。

とにかく、コンピュータで起こっているを理解するには、リアルの何に相当するのか?
ということをイメージすることが肝心です ヾ(´ー`)ノ


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

達人養成塾 小川です。おはようございます。

竹端さん:

> 今回は素直にギブアップ。動画で答えを確認してからおさらいしてみましたが、問題3ではIF構文でついつい、以下の間違いをしました。
>
> If Range(retu & kati).Value < Range(retu & gyou).Value Then
>
> 右辺の列の箇所は変数を使用しないんですね。

ギブアップ、おめでとうございます ヾ(´ー`)ノ
そういう体験は、とてもよいことです。これまでの枠を大きく超えられる
きっかけが来ている、ということですから! (^o^

「for next構文では『 & 変数』とやるもの」、とか、ひょっとして、そんな固定観念を持ってしまってはいませんか? (@_@;

頭の中で固定化され、ひとまとまりのものとして扱われていたものを分離していけるようになると、スキルはワンランク上のものになります。

Range("A1").Value と言ったらセルA1の値だな、という思考から、
「この言葉は、ピリオドで二つに分割できる」と気づきます。
次には、"A1"って文字列なのか!と気づきます。
その次に、"A" & 1 でもいいのか、気づきます。

そういうことの延長のようなことが今、頭の中で起こっていると思ってください。


あと、プログラミングで自分の理解を超えそうなことがあったときには、書かれているプログラムを指でなぞりながら、何をしようとしているのか機械的な日本語で表現してみることです。


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

本講座の動画一覧

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

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ