勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと?

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

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

解説

演習問題テーマ:勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと?

項目が出現したらその回数ではなく隣の列の金額を加算する仕組みをつくります。

合計額をあらわす変数をたてること、For Next構文で調べ終わったら合計額を表示する仕組み、複数の項目がある場合に初期化してから次の項目の金額を新たに加算しはじめる仕組みは第10回と同じ。今月支払額合計を、初期化する前の各項目の合計額を利用して加算していく仕組みは、よくみると出現するたびに加算する仕組みと同じだということに気づいてください。

途中ででてくるGoukeiという変数をkobetsuに一気にかえるやり方もここで覚えてください。

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

10867 : 小川慶一の回答 (2018-12-29 16:04:54)

受講生 さん:

こんにちは。

> sumifs関数もマクロで実現可能ですか?

受講生さんは、どう思われますか。
・実現可能だと思う
・実現不可能だと思う

上記どちらかを選択のうえ、「そう思った理由」もお知らせください。


10863 : 受講生さんのコメント (2018-12-29 14:45:20)

sumif関数の方法は理解できました。sumifs関数もマクロで実現可能ですか?


10154 : 小川慶一の回答 (2018-06-24 09:21:08)

garuruさん:

そうですね。
数学でも、公式を習ったあと、計算問題、文章題を解いて、ひととおりのパターンを学んで完成です。
エクセルマクロも同様です。基本文法を習って、書きたいことを書けるような練習をして、それから実践演習です。

> ご返信ありがとうございます。
>
> >演習には、パターンをしっかり学ぶということを意識して取り組んでください。
> ⇒上記アドバイス、ありがとうございます。フォローアップはアウトプットのみのイメージでいたのですが、「パターンを覚える」というインプットの要素もあることを意識します。
> 今後ともよろしくお願いします。


10152 : garuruさんのコメント (2018-06-24 00:07:36)

ご返信ありがとうございます。

>演習には、パターンをしっかり学ぶということを意識して取り組んでください。
⇒上記アドバイス、ありがとうございます。フォローアップはアウトプットのみのイメージでいたのですが、「パターンを覚える」というインプットの要素もあることを意識します。
今後ともよろしくお願いします。


10151 : 小川慶一の回答 (2018-06-23 13:01:03)

garuruさん:

「自分で考え抜いて、思いついた方法でとにかく書き上げられた」ということが、まずは、とてもすばらしいと思います。
そういうことをやりきれる力は、「ロジカルシンキング」とか、「ロジカルに表現しきる」ということの力そのものです。

ということなので、

>先生の正解に近づくにはロジカルシンキングの様なものが欠如しちるように思えるのですが、

「シンキング」の力は十分にあると思いますよ。
考え方の「パターンのストック」みたいなのがまだ少し足りないだけかな、と思います。

ということなので、演習には、パターンをしっかり学ぶということを意識して取り組んでください。
思いつかなかったやり方が出てきたとしても、「あ、これはこういうパターンなんだな」くらいに思って (^_^ )☆

演習ひととおりやってからこの問題を再度解き直せば、そのときには、僕がここで書いたことの意味がよりはっきり分かるかもしれません。


10150 : garuruさんのコメント (2018-06-23 01:56:50)

初投稿となります。よろしくお願いします。問2で、下記の様なプログラムを書いてしましまた。一応やりたいことはできたのですが、「項目の分だけ変数を作ってelseifで処理する」という考えが真っ先に思いつき、しそ巻き無料の問題でも同じ構文でかいていました。

先生の正解に近づくにはロジカルシンキングの様なものが欠如しちるように思えるのですが、何かアドバイス頂けないでしょうか?

 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


10131 : 小川慶一の回答 (2018-06-19 13:43:53)

morimotoさん:

「ハナコのステップ」を徹底してください。

> 現場の第一線のプログラマーもやはり紙に書きだしたりすることあるのでしょうか?

あなたはどう思われますか?


> for nextが2段階あることでわかんなくなるんですが、紙に書けばほんとわかりました。
> 2つのfor nextを頭の中で同時に動かすから混乱するようです。
> 1つのfor nextを止めてもう1つのfor nextを動かしていけば見通しがたちました。
> あとはカウンターをどこで0にリセットするかですよね。
> 現場の第一線のプログラマーもやはり紙に書きだしたりすることあるのでしょうか?


10130 : 小川慶一の回答 (2018-06-19 13:42:32)

morimotoさん:

紙に書くのとても良いことです。


発展編1に進むともっと簡単な方法を学べます。
基礎編はマクロを書ききるのに必要な腕力と体力をつけることを重視しているので、便利な道具にはあまり頼らず、少ない道具で、ベタな方法ででも解決できるような方法を紹介しています。

> Sumifで余裕、、、まさかマクロ塾ではそんなシンプルでは終わらないと思いきやその通りでした。
>しそ巻き問題といいこの問題といいほんととっつきにくいものでした。
>が画面ばかり見ても仕方ないのでいつもあるように「紙に書いて」みればよく流れが見えました。
>わからないときこと紙に書き出せば見えるものですね。


10122 : morimotoさんのコメント (2018-06-17 01:53:17)

for nextが2段階あることでわかんなくなるんですが、紙に書けば
ほんとわかりました。2つのfor nextを頭の中で同時に動かすから
混乱するようです。1つのfor nextを止めてもう1つのfor nextを動か
していけば見通しがたちました。あとはカウンターをどこで0に
リセットするかですよね。現場の第一線のプログラマーもやはり
紙に書きだしたりすることあるのでしょうか? 


10121 : morimotoさんのコメント (2018-06-17 01:46:51)

Sumifで余裕、、、まさかマクロ塾ではそんなシンプルでは終わら
ないと思いきやその通りでした。しそ巻き問題といいこの問題と
いいほんととっつきにくいものでした。が画面ばかり見ても仕方
ないのでいつもあるように「紙に書いて」みればよく流れが見えました。わからないときこと紙に書き出せば見えるものですね。


9499 : 小川慶一の回答 (2018-03-01 08:53:22)

ゲストさん:

おはようございます。

> 練習してみて気づいたのが、
> [中略]
> 順番を逆にしていたのでうまくいかず、うんうん唸っていました笑
> うまくいったときはとてつもない快感でした!

失敗の経験も大切ですね。
ひきつづきよろしくお願いいたします (^^*


9494 : 近藤さんのコメント (2018-02-27 23:06:39)

右のリストの変数・左のリストの変数よくわかりました。
練習してみて気づいたのが、
例えば(実務で使っているデータ)、
右のリスト(元となる表データ)の変数
左のリスト(合計の算出先)の変数をつくり、
動画と同じようにハナコでくくってもなぜかうまく動かないなと悪戦苦闘していたところ、
右のリスト(元となる表データ)の箱を先につくり、
左のリスト(合計の算出先)でくくらないとうまくいかないのですね。
順番を逆にしていたのでうまくいかず、うんうん唸っていました笑
うまくいったときはとてつもない快感でした!


9261 : 小川慶一の回答 (2017-12-22 07:03:14)

吉川 裕子さん:

CountIf関数の代わりなら
kazu = kazu + 1

SumIf関数の代わりなら
gokei = gokei + [[セルの値]]

という感じですね。パターンは同じです。
あとは、初期化。


「出現回数を数える。CountIf関数がやっていることをマクロで書くと?」でも、複数の項目それぞれに対して合計数を数えるとき、初期化をしています。
今見ると、改めて気づくことかあるかも。

出現回数を数える。CountIf関数がやっていることをマクロで書くと?
https://online.pc5bai.com/movie/index/27/150



> 実務ではsumif関数を使っていたので、マクロにするとどうなるか興味深く学習いたしました。
> 実務だととにかく動けばよいという感じだったので、マクロにしようと思っていなかったというのもあります・・・
> 内容的には以前の講座の応用でしたが、変数を0に戻すか戻さないかがどう影響するのかを復習できました。
> 引き続き学習を進めていきますので、よろしくお願いいたします。


9257 : ガラパゴスタディー吉川の回答 (2017-12-21 16:22:17)

実務ではsumif関数を使っていたので、マクロにするとどうなるか興味深く学習いたしました。
実務だととにかく動けばよいという感じだったので、マクロにしようと思っていなかったというのもあります・・・
内容的には以前の講座の応用でしたが、変数を0に戻すか戻さないかがどう影響するのかを復習できました。
引き続き学習を進めていきますので、よろしくお願いいたします。


8899 : 小川慶一の回答 (2017-09-17 11:59:30)

受講生 さん:

よくあるパターンです (^^

> 動画4を基礎にして出現回数を金額に置き換える。
> 合計は、累計にならないようにループの初めに0をする。


8894 : 受講生さんのコメント (2017-09-17 08:26:04)

動画4を基礎にして出現回数を金額に置き換える。
合計は、累計にならないようにループの初めに0をする。


8761 : 小川慶一の回答 (2017-08-24 23:32:20)

浦山大さん:

まったくもって、順調ですね。
ただただ、楽しんでください☆


8758 : 浦山大さんのコメント (2017-08-23 12:18:58)

あら、↓のプログラムの…

for gyo = 4 to 9

以下のgoukei=0が一タブ多かったです。
自分で修正しておきます…。


8757 : 浦山大さんのコメント (2017-08-23 12:14:50)

久しぶりにコメントを記載します。

動画は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


8360 : 小川慶一の回答 (2017-06-14 09:31:32)

受講生 さん:

以下の件にポイントを絞って回答します。

> 記載しています。実行した場合、回答と同じ値が導いていますが、回答のように、ループ後の出力先を記載することが、いいのでしょうか。

こびとちゃんになったつもりで手作業してみてください。
どっちのほうがこびとちゃんにとって面倒くさいか(=よりプログラムの実行に負荷がかかるか)、痛感できると思います。

> 記載したprogramのgoukei の場合は、最終のループ後に記載しています。

↑これは、何を言いたいのか、いただいたご質問からは理解できませんでした。改めてご質問いただけますか。

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


8351 : 受講生さんのコメント (2017-06-13 21:45:01)

お世話になります。
下記の記載した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]


8126 : 小川慶一の回答 (2017-05-14 10:14:53)

受講生 さん:

> [3]
> [2]で作ったマクロを改変し、さらに、セルD10、セルE10に各列の合計額を記入するマクロとしなさい についてセルD10 にD4からD9の合計額を表示するというマクロを作る場合にはどのような式で書くことができますか?
> [1][2]については以下のようなマクロで問題なく動いたのですが、D列の値をそれぞれの項目について値を入れていくというマクロ(累積値ではなく)になったので、合計のマクロが作れませんでした。

やってみましょう。
まずは、いただいたコードをまずは以下のように編集しました。

[a] 変数はループより前に宣言
[b] インデントを整理。for next構文、if文内のコードはしっかり→にズラす

Sub test_ogawa()
  Dim harai
  Dim koumoku
  Dim iwai
  Dim retsu
  For harai = 4 To 9
    koumoku = Range("B" & harai).Value
    iwai = Range("D" & harai).Value
    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


↑自力で改めてここまで到達してください。[a], [b]ともに大切です。

さてさて。
総計を含めるなら、以下の[p], [q], [r], [s]を含める感じですね。

Sub test_ogawa_soukei()
    Dim harai
    Dim koumoku
    Dim iwai
    Dim retsu
    Dim soukei '[p]
    
    For harai = 4 To 9
        koumoku = Range("B" & harai).Value
        iwai = Range("D" & harai).Value
        For retsu = 4 To 10
            If Range("I" & retsu).Value = koumoku Then
                iwai = iwai + Range("J" & retsu).Value
                soukei = soukei + Range("J" & retsu).Value '[q]
            End If
        Next
        Range("D" & harai).Value = iwai
        Range("E" & harai).Value = Range("D" & harai).Value + Range("C" & harai).Value
    Next
    Range("D10").Value = soukei '[r]
    Range("E10").Value = Range("C10").Value + Range("D10").Value '[s]
End Sub


> Range("D10").value=Sum(”D4:D9”).valueというのも試しましたが

↑これは、文法的にはないです。。
発展編1で扱いますが、以下ならばあり。

Range("D10").Value = Worksheetfunction.Sum(Range("D4:D9"))

なお、お題では、課題解決のために[1]→[2]と作ってきたマクロをさらに改変して[3]を作る、としていますが、ロジックの理解が難しければ、複数のForNext構文を作り、それぞれで個別に仕事をさせる、というのもありです。

例えば、以下。

Sub waketeshukei_1()
    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
        Range("D" & hida).Value = goukei
        Range("E" & hida).Value = Range("C" & hida).Value + goukei
    Next
    
    Dim soukei
    For hida = 4 To 9
        soukei = soukei + Range("D" & hida).Value
    Next
    Range("D10").Value = soukei
    Range("E10").Value = Range("C10").Value + soukei
End Sub


さらに言えば、E列に値を入れる部分も、別のForNext構文を作り、そこで実施してもいいかも。以下。

Sub waketeshukei_2()
    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
        Range("D" & hida).Value = goukei
    Next
    
    Dim soukei
    For hida = 4 To 9
        soukei = soukei + Range("D" & hida).Value
    Next
    Range("D10").Value = soukei
    
    For hida = 4 To 9
        Range("E" & hida).Value = Range("C" & hida).Value + Range("D" & hida).Value
    Next
    Range("E10").Value = Range("C10").Value + soukei
End Sub


↑だいぶ、ロジックがすっきりしますね。

Dim soukei 以下の部分をひとつにまとめなおしてみます。

Sub waketeshukei_3()
    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
        Range("D" & hida).Value = goukei
    Next
    
    Dim soukei '[x1]
    For hida = 4 To 9
        soukei = soukei + Range("D" & hida).Value '[x2]
        Range("E" & hida).Value = Range("C" & hida).Value + Range("D" & hida).Value '[x3]
    Next

    Range("D10").Value = soukei
    Range("E10").Value = Range("C10").Value + soukei
End Sub


↑waketeshukei_1 と同じ形に戻りました。

さらに、「For hida = 4 To 9」の2つのFor Next構文をひとつにまとめてみます。
すると、以下。

Sub waketeshukei_4()
    Dim goukei
    Dim migi
    Dim hida
    Dim soukei '[x1]
    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
        Range("D" & hida).Value = goukei
        soukei = soukei + Range("D" & hida).Value '[x2]
        Range("E" & hida).Value = Range("C" & hida).Value + Range("D" & hida).Value '[x3]
    Next
    
    Range("D10").Value = soukei
    Range("E10").Value = Range("C10").Value + soukei
End Sub


僕が動画の中で示した回答例は、↑これの souke = soukei + ... の処理をするタイミングを For migi = 4 To 10 ... Next の中にしただけです。
以下。

Sub waketeshukei_5()
    Dim goukei
    Dim migi
    Dim hida
    Dim soukei '[x1]
    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
                soukei = soukei + Range("J" & migi).Value '[x2-改]
            End If
        Next
        Range("D" & hida).Value = goukei
'        soukei = soukei + Range("D" & hida).Value '[x2-旧]
        Range("E" & hida).Value = Range("C" & hida).Value + Range("D" & hida).Value '[x3]
    Next
    
    Range("D10").Value = soukei
    Range("E10").Value = Range("C10").Value + soukei
End Sub


最後のは、ちょっと難しかっだかな。。
ともあれ、いろいろ書いてみました。今回提供したサンプルコードを動かしてみたり自分で書いてみたりとして、遊んでみてください。


8124 : 受講生さんのコメント (2017-05-14 08:41:52)

[3]
[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


7426 : 小川慶一の回答 (2016-12-15 17:18:05)

受講生 さん:

結論を書くと、以下のとおりです。

・上のマクロでは、 hida = 6 のとき、一度も Range("D" & hida).Value = goukei が実行される
・下のマクロでは、 hida の値に関わらず、 Range("D" & hida).Value = goukei は必ず一度実行される

まずはそのくらいで。
ピンとこないようでしたら、じっくり動作確認を。上のマクロで、 hida = 6 のときの動きを、ステップインモードで慎重にレビューしてください。([F8] で実行)



>受講生 さん:
>
>上のコードは「空白」になり、下のコードは「0」になります。
>ご確認宜しくお願い致します。
>
>>お世話になっています。一つ聞きたいことがあります。
>>下記のように、 Range("D" & hida).Value = goukeiをfor next (migi)の構文内で実行すると、今月支払いのない成人祝いの欄は「空白」で表示されます。
>>構文外にこの式を置くと「0」と表示されるのですが、構文内に置くとなぜ「空白」になってしまうのでしょうか。
>>

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

>
>>
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
>>            End If
>>        Next
>          Range("D" & hida).Value = goukei
>>    Next
>>End Sub

>


7424 : 受講生さんのコメント (2016-12-15 17:04:52)

受講生 さん:

上のコードは「空白」になり、下のコードは「0」になります。
ご確認宜しくお願い致します。

>お世話になっています。一つ聞きたいことがあります。
>下記のように、 Range("D" & hida).Value = goukeiをfor next (migi)の構文内で実行すると、今月支払いのない成人祝いの欄は「空白」で表示されます。
>構文外にこの式を置くと「0」と表示されるのですが、構文内に置くとなぜ「空白」になってしまうのでしょうか。
>

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


>
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
>            End If
>        Next
          Range("D" & hida).Value = goukei
>    Next
>End Sub


7422 : 小川慶一の回答 (2016-12-15 11:21:53)

受講生 さん:

比較できるように、まずは、両方の例を並べて投稿いただけますか。


>お世話になっています。一つ聞きたいことがあります。
>下記のように、 Range("D" & hida).Value = goukeiをfor next (migi)の構文内で実行すると、今月支払いのない成人祝いの欄は「空白」で表示されます。
>構文外にこの式を置くと「0」と表示されるのですが、構文内に置くとなぜ「空白」になってしまうのでしょうか。
>

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


7421 : 受講生さんのコメント (2016-12-15 11:11:20)

お世話になっています。一つ聞きたいことがあります。
下記のように、 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


7266 : 小川慶一の回答 (2016-11-06 22:07:09)

受講生 さん:

こんばんは。

これは計算量が多いですね。。なんとかしたくなるのも分かります (^_^;
とはいえ、基礎編レベルの知識ではこれが限界です。

受講生さんも受講済の発展編1で、 WorksheetFunction というオブジェクトを扱っています。
名前のとおり、エクセルのワークシート関数を呼び出してVBAで利用できるというものです。
使いこなせるようになると、同様の計算をするエクセルワークシート関数をご存知でしたら、自分で計算アルゴリズムを編み出さないでも1行で計算をしてくれて便利です。
古典的かつ代表的なワークシート関数でしたらほぼほぼVBAから利用可能です。

以下に、Sum関数、Count関数、CountIf関数を活用する場合のサンプルを示します。試してみてください。

Sub wsfsample()
    Range("N2").Value = WorksheetFunction.Sum(Range("M2:M51"))
    Range("N3").Value = WorksheetFunction.Count(Range("M2:M51"))
    Range("N4").Value = WorksheetFunction.CountIf(Range("F2:F51"), "=渋谷区")
End Sub


上に示したサンプルコードからも分かるとおり、引数でセルを指定する際は、セル番地でなく、セルをオブジェクトとして指定する必要があります。
あと、エクセルのバージョンによっては、 WorksheetFunction の前に Application. をつけなくてはならないかも。
そこだけ注意。

それから、エクセルで開いているファイルのどれかに計算量の多いワークシート関数が大量に含まれている場合も処理が遅くなる傾向があります。
セルの編集がある都度、すべてのワークシート関数が再計算をするからです。
VLookUp関数とかIsError関数とか、そういうたぐいのがぐちゃぐちゃと入れ子になっているセルが大量にあるとかの場合ですね。

その場合、マクロでの処理開始の前に、ワークシート関数の再計算機能を停止させ、処理後に自動で再計算するように再設定します。
以下の要領。

Sub calcsample()
    Application.Calculation = xlCalculationManual
    Range("N2").Value = WorksheetFunction.Sum(Range("M2:M51"))
    Range("N3").Value = WorksheetFunction.Count(Range("M2:M51"))
    Range("N4").Value = WorksheetFunction.CountIf(Range("F2:F51"), "=渋谷区")
    Application.Calculation = xlCalculationAutomatic '[*]
End Sub


[*]について補足すると、エクセルで設定画面から再計算を自分で止めている人も(滅多にないですが)いるかもしれないので、以下のほうがより親切。

Sub calcvsample()
    Dim c As Long
    c = Application.Calculation '[+]
    Application.Calculation = xlCalculationManual
    Range("N2").Value = WorksheetFunction.Sum(Range("M2:M51"))
    Range("N3").Value = WorksheetFunction.Count(Range("M2:M51"))
    Range("N4").Value = WorksheetFunction.CountIf(Range("F2:F51"), "=渋谷区")
    Application.Calculation = c '[*]
End Sub


なぜ変数を Long 型にしたのか?とか [+] でなにをしているのか?とかいったことについては、基礎編レベルを大きく超えるのでここでは説明割愛します。
受講生さんは発展編1受講済のようですので、まずは上記についてテキストにて再学習のうえ、さらにご質問あるようでしたら、発展編1講座のどこかでまたご質問いただければと。


7264 : 受講生さんのコメント (2016-11-06 12:02:44)

小川先生
お世話になっております。
単純ですが、シートにある勘定科目毎に伝票を集計し、合計を別シートの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


6329 : 小川慶一の回答 (2016-04-04 07:50:34)

受講生 さん:

条件文の可読性を高めるためなら、発展編1で扱っている途中改行のノウハウを。
あと、発展編1レベルの方法で解決するのでしたら、モジュールレベル変数を使えばもっとキレイにいくかな。
発展編2で Function プロシージャを学べばさらに華麗に決まります。いずれにしても、まずは発展編1の復習を。




>お世話になります。
>先程の列のループの質問の続きです。
>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
>


6326 : 小川慶一の回答 (2016-04-04 07:44:04)

受講生 さん:

>列を行(hida) みたいに 変数にできないでしょうか。Coulmns指定??・・基礎マクロ範囲であれば教えてください。

↑発展編1で扱っている Offset ですね。


6285 : 受講生さんのコメント (2016-04-04 02:26:52)

お世話になります。
先程の列のループの質問の続きです。
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


6280 : 受講生さんのコメント (2016-04-03 14:56:04)

お世話になります。
現場では 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


6131 : 小川慶一の回答 (2016-03-26 13:48:50)

受講生 さん:

すんばらしいですw
もう、言葉が見つかりません。何もかもすばらしいです☆


>このパターンの練習不足を感じましたので、手持ちのサンプルデータで補習してみました。
>顧客名が混在する日付順の販売データから特定顧客データを抜き出し、別シートにある請求書雛形に転記するという目標です。

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


6128 : 小川慶一の回答 (2016-03-26 13:41:49)

受講生 さん:

そういう問題を自力で見つけて解決できればもう心配いらないです。
素質あると思いますよ。


6127 : 小川慶一の回答 (2016-03-26 13:40:52)

受講生 さん:

まーしかし、やっていることホント同じですよ。
数を数えるときは「+1」している。合計を求めるときは、「+値」している、そんだけです。

>自分はまだまだですが、やはりF8を押して1行ずつマクロを動かし、
>変数の値がどのように変わっていくかと、NEXTやEND IFの後、
>どの行に戻るのかをきちんと確認していく作業が大事だと感じました。
>
>マウスオンで、変数の値が確認できるのは素晴らしいです!

こういう地味な機能の活用がスラスラできるかどうかがポイント!ですね。
身体が作業を覚えこんでしまえば、頭は作業のことではなくてアルゴリズムだけに集中できるので。

ひきつづきお楽しみを☆


6125 : 受講生さんのコメント (2016-03-26 13:31:21)

このパターンの練習不足を感じましたので、手持ちのサンプルデータで補習してみました。
顧客名が混在する日付順の販売データから特定顧客データを抜き出し、別シートにある請求書雛形に転記するという目標です。

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


6121 : 受講生さんのコメント (2016-03-25 20:09:46)

動画をみて、同時にD列総計を求める方法を学びましたので、
自分でもやってみたのですが・・・結果がどうしても200になってしまうので原因を探していたら
sokei=sokei+Range("D"&hidari).value
とするべきところを、
sokei=gokei+Range("D"&hidari).value
としていました(笑)
gokei は1項目の集計が終わったらリセットされるから、
これだと最終項目お見舞い袋の集計結果100に、もう一度gokeiを足しただけですね。
まだまだでした(笑)
by gooska


6120 : 受講生さんのコメント (2016-03-25 18:38:00)

しそ巻き無料のカウントマクロを使えばできるという説明で
いったん動画を止めて、問題に取り組みましたが、・・・
最初思うようにできませんでした。
変数の値が加算されず、常に最新値のみが表示されてしまったり(笑)

しそ巻き無料の動画を見直し、もう一度理解してから再挑戦すると、
カウントを加算に変更するだけなので、今度はうまくいきました。
ただしC,D,E列それぞれの単体マクロしか書けませんが(笑)

ポイントは3つですね。
1変数=変数+指定セルの値 という式の理解
2計算が終わった変数をワークシートに吐き出す式をどこに入れるか
3カウンタの初期化をどこにいれるか

自分はまだまだですが、やはりF8を押して1行ずつマクロを動かし、
変数の値がどのように変わっていくかと、NEXTやEND IFの後、
どの行に戻るのかをきちんと確認していく作業が大事だと感じました。

マウスオンで、変数の値が確認できるのは素晴らしいです!
最近キーボードだけでそれができたらいいのになと思います、
ようやくキーボード操作でVBEウィンドウとワークシートの切り替えが
できるようになったので。
by gooska


5531 : 小川慶一の回答 (2016-01-08 14:22:53)

受講生 さん:

ご指摘のメリット、すばらしいと思いますよ。
デメリットはデメリットといえるようなものではないです。

よって、いただいたサンプルのほうが僕が動画で示したものよりよいですね ヾ(´ー`)ノ


>小川先生:
>別に議論するつもりは全くないのですが、コメントを頂いたので回答します。
>何かおかしな点がありましたら、ご指摘ください。
>
>メリット
>・変数soukeiへの代入が左の表の項目数に対して1回で済む。
> (右の表のデータ量の影響を受けないので、無駄が省ける)
>・変数soukeiへの代入時に、セルの値を代入するより、変数を代入した方がセルへのアクセスが減り、
> 内部では効率的(速度的にも有利)に思えた。
>デメリット
>・「変数=変数+セル」という考え方からすると、見本の方が理解しやすいかもしれない。
>
>>受講生 さん:
>>
>>見本と比較し、両者のメリットデメリットについて論じてください。
>>
>>
>>>変数soukeiの位置をIf文の中から移動し、一部修正しました。
>>>
>>>

>>>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
>>>

>>>
>>
>


5527 : 受講生さんのコメント (2016-01-06 23:19:15)

小川先生:
別に議論するつもりは全くないのですが、コメントを頂いたので回答します。
何かおかしな点がありましたら、ご指摘ください。

メリット
・変数soukeiへの代入が左の表の項目数に対して1回で済む。
 (右の表のデータ量の影響を受けないので、無駄が省ける)
・変数soukeiへの代入時に、セルの値を代入するより、変数を代入した方がセルへのアクセスが減り、
 内部では効率的(速度的にも有利)に思えた。
デメリット
・「変数=変数+セル」という考え方からすると、見本の方が理解しやすいかもしれない。

>受講生 さん:
>
>見本と比較し、両者のメリットデメリットについて論じてください。
>
>
>>変数soukeiの位置をIf文の中から移動し、一部修正しました。
>>
>>

>>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
>>

>>
>


5524 : 小川慶一の回答 (2016-01-06 10:03:16)

受講生 さん:

見本と比較し、両者のメリットデメリットについて論じてください。


>変数soukeiの位置をIf文の中から移動し、一部修正しました。
>
>

>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
>

>


5515 : 受講生さんのコメント (2016-01-05 22:11:36)

変数soukeiの位置をIf文の中から移動し、一部修正しました。

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


5230 : 事務局 大山 最枝さんのコメント (2015-11-08 10:37:43)

受講生 さん:ご指摘ありがとうございます。
動画の撮り直しとなりますと、しばらくお時間を頂戴することになります。
ご不便をおかけいたしますが、差替えが完了しましたらお知らせいたします。

>ああ、過去の掲示板にしっかり書いてあるのですね。小川先生、これ撮り直した方がいいですよ。大した作業じゃない
でしょう。すぐに対応できる人が多いので、さほど問題になっていないようですが、いろんな受講生がいらっしゃいますからね。
撮り直したら、本掲示内容と前掲示内容の削除もお願いします。


5208 : 受講生さんのコメント (2015-10-31 15:36:09)

ああ、過去の掲示板にしっかり書いてあるのですね。小川先生、これ撮り直した方がいいですよ。大した作業じゃない
でしょう。すぐに対応できる人が多いので、さほど問題になっていないようですが、いろんな受講生がいらっしゃいますからね。
撮り直したら、本掲示内容と前掲示内容の削除もお願いします。


5207 : 受講生さんのコメント (2015-10-31 15:13:00)

基礎編フォローアップ動画第11回 の解説おかしくないですか?I4からI10の詳細に書かれている内容を、B4~B9に分類して、その分類ごとの合計を計算するんでしょう?
”結婚祝い”しか反映されていないですよね?まぁ、やり方はわかるので、イイっちゃいいのですが・・・


5197 : 事務局の回答 (2015-10-28 00:28:41)

金親 幸加 さん:

お世話になっております。
こちらで動画と同じソースを書いて検証してみたところ、動画の結果と同じ数値が出ました。
おそらく、ループカウンターが1足りないのではないかと思いますが、
宜しければ金親様が書いたソースを送っていただけますでしょうか?
どうぞ、よろしくお願いいたします。

>VBA基礎フォローアップの第11回目の講座をオンラインで受けさせて頂きました。
>早速質問なのですが、小川先生のコーディングのやり方を真似して実際に打ってみましたが、
>動画の結果より全体的に数が5000少なくなってしまいます。この場合どうすればいいでしょうか?


5196 : 事務局の回答 (2015-10-27 22:29:40)

金親 幸加 さん:

お問い合わせありがとうございます。
調査いたしますので、暫くお待ちください。

>VBA基礎フォローアップの第11回目の講座をオンラインで受けさせて頂きました。
>早速質問なのですが、小川先生のコーディングのやり方を真似して実際に打ってみましたが、
>動画の結果より全体的に数が5000少なくなってしまいます。この場合どうすればいいでしょうか?


5188 : 金親 幸加さんのコメント (2015-10-26 10:34:22)

VBA基礎フォローアップの第11回目の講座をオンラインで受けさせて頂きました。
早速質問なのですが、小川先生のコーディングのやり方を真似して実際に打ってみましたが、
動画の結果より全体的に数が5000少なくなってしまいます。この場合どうすればいいでしょうか?


3976 : 井上 聡さんのコメント (2015-03-16 05:59:24)

動画再収録解説の問題点
1、sub Kazoeru プログラム上から9行目”結婚祝い”のままです。
2、一度リセットするプログラムがありません。
画像は依然より良くなっています。頑張ってください。


3581 : 小川慶一の回答 (2015-01-11 22:19:30)

井上 聡 さん:

まだおかしいね。

Next(D)

のところが構文エラーです。

ということで、

> If then end ifは条件が一致すると常にそのまま進むものであるのでしょうか。
> If thenだけでend if を使用しない構文(多分?)の場合とはどのように使い分けるのでしょうか。

上記の質問にお答えできるところまで到達できません。

こんなやりとりしてても時間のムダですので、次回は動作確認済みのマクロ送ってください。
念のために書きますが、「動くかどうか」だけじゃなくて、質問したい点についても自分の想定どおりに動作するマクロかどうか確認してから送ってください。

動作確認するときは、特に知りたいところは [F8] でステップイン実行しながらしっかり確認しつつ。
[F5], [F8], [F9] の使い分けについて解説した動画を見直し、僕がこの動画で動作テストをしているときにそれらをどう活用しているかを確認して。

質問の内容からも感じますが、全体にもう少し自分で検証する習慣をつけたほうがよいかと思います。

もしもそれを面倒に感じるようでしたら、タイピングスキルとショートカットキー活用の練習不足です。
タイピングスキルについては以下の動画で。
https://online.pc5bai.com/movie/index/24

ショートカットキー操作については、以下。
https://online.pc5bai.com/movie/index/25/121
https://online.pc5bai.com/movie/index/25/122

突き放しているように読めるかもしれませんが、自分で問題解決できる力をつけるのがいちばんです。
それがあればそもそもしないで済みそうな質問にも感じます。


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




Sub siharairisuto()
    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 を使用しない構文(多分?)の場合とはどのように使い分けるのでしょうか。
>


3577 : 井上 聡さんのコメント (2015-01-11 18:59:36)

Sub siharairisuto()
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 を使用しない構文(多分?)の場合とはどのように使い分けるのでしょうか。


3572 : 小川慶一の回答 (2015-01-11 00:15:18)

井上さん、

dim kobetu()

というのがあるのですが、ここでエラーがでます。
(A)-(D)の注釈もその前にコメント記号がないため、それらがある行全体が構文エラーになります。

動作確認済のプログラムを再度お送りください。
よろしくお願いいたします。


3569 : 井上 聡さんのコメント (2015-01-10 13:40:33)

再送Nextの位置も移動しています。動画11のend ifの位置について質問です。以下のプログラムは先生通りです。
(A)の位置が正解ですが、条件が一致した場合、(B)の位置の場合end ifに関係なく次の行に進みます。end if までで一区切りになって ifにもどりません。なぜでしょうか。?for next内なら進むことができるのでしょうか。
但し、nextの位置も(C)から(D)に移動する条件です。
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(C)
range("D" & hida).value=kobetsu
range("E"& hida).value=range("C"&hida).value+kobetu
(B)
konrui=kobetu+konrui
sourui=range("E"&hida).value+sourui
(D)
next
range("D10").value=konrui
range("E10").value=sourui
end sub


3568 : 井上 聡さんのコメント (2015-01-10 13:20:53)


動画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


2569 : 小川慶一の回答 (2014-09-28 07:49:34)

匿名 さん:

というか、前にも書いていますが、この問題、元の表がおかしいです。
I列がカテゴリ、H列が詳細で、カテゴリごとに集計したい、というのが題意だったので。

撮り直ししようかな。。とも思っています。

あしからず、ご了承ください m(_ _)m


2567 : 受講生さんのコメント (2014-09-27 11:25:26)

小川先生

左の表ではB9の"項目名"列は「事務用品」ですが、比較する右の表の"詳細"列のI5は「事務用品」ではなく「お見舞い袋」となっているため、
動画のコードですと、「事務用品」の「今月支払額」が0となり、合計が100円合わなくなってしまうと思います。
他の方も投稿しているとおり、B列とI列の比較だけではなく、B列とH列も比較し、変数goukeiに加算した方がいいのでしょうか?


1870 : 小川慶一の回答 (2014-08-06 23:20:53)

> なれると関数より楽に、かつ、もっと複雑な処理ができますね。
> もっとマクロを学ぶことで仕事自体が劇的に変わっていく予感がしています。(^^

そうですよー。じゃなきゃ、こんな手間書けてマクロ教えません。
それだけインパクトのデカい技術です。ぜひ、ますますしっかりとモノにしてください!!


1865 : 明石 照伸さんのコメント (2014-08-05 23:11:39)

お世話になります。

問題をここまでやらせていただいて
ようやく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関数で行っていたような複数の表にまたがる処理が
マクロでできるようになりました。

一回限りの書き捨てのマクロでデータ整合性チェックをしたり
ができるので相当作業時間を短縮できていると思います。なれると関数より楽に、
かつ、もっと複雑な処理ができますね。もっとマクロを学ぶことで仕事自体が
劇的に変わっていく予感がしています。(^^


1759 : 小川慶一の回答 (2014-07-18 05:38:25)

匿名 さん:

>別ファイルへ置いておくのは、仕事がシステムデータ抽出後の加工が主な為です。
>あと、いまだにマクロが突然変異でウイルス化するとでも思っている人たちのアレルギー回避というのもありますね。

なるほどです。

最初のうちは、僕もときどきプログラム印刷しました。

>基本編で、ここまで出来るのなら応用編で、どこまで出来るのかめっちゃ楽しみです。

期待にお応えいたします☆
「基礎編」の次は「発展編1」。そこまでは「より骨太なプログラムを書けるようになる」というのが目標です。
そこからは、「さらに骨太を目指す」ということでしたら「発展編2」。
「人に使ってもらえる仕組みを作る」ということでしたら「イベントとフォーム」。
エクセルという閉じた世界から飛び出したくなったら、「Web連携」と「外部連携」があります。
(上記をすべて押さえられたら、IBM時代の僕よりスキル的には上です)

以下の講座構成図も参考にしてください。
http://www.exvba.com/kouza.php#kousei


僕も iPhone, iPad mini でkindleアプリ使っています。
横浜からの成田エクスプレス車中では、塩野七生の「ローマ人の物語Ⅲ」を読むつもりです。

よい週末を☆



>小川先生
>
>ご返答ありがとです。
>別ファイルへ置いておくのは、仕事がシステムデータ抽出後の加工が主な為です。
>あと、いまだにマクロが突然変異でウイルス化するとでも思っている人たちのアレルギー回避というのもありますね。
>
>印刷もどうってことない簡単なものだったんですね。
>何か特別な操作が必要なのかと思ってました。
>基本編で、ここまで出来るのなら応用編で、どこまで出来るのかめっちゃ楽しみです。
>
>kindleってiphoneにもアプリがあるんですね。早速、amazonで購入させて頂きました。
>千葉の研修も頑張ってくださいね。


1755 : 受講生さんのコメント (2014-07-18 00:54:35)

小川先生

ご返答ありがとです。
別ファイルへ置いておくのは、仕事がシステムデータ抽出後の加工が主な為です。
あと、いまだにマクロが突然変異でウイルス化するとでも思っている人たちのアレルギー回避というのもありますね。

印刷もどうってことない簡単なものだったんですね。
何か特別な操作が必要なのかと思ってました。
基本編で、ここまで出来るのなら応用編で、どこまで出来るのかめっちゃ楽しみです。

kindleってiphoneにもアプリがあるんですね。早速、amazonで購入させて頂きました。
千葉の研修も頑張ってくださいね。





1746 : 小川慶一の回答 (2014-07-16 12:45:44)

匿名 さん:

>簡単なクロス集計位なら、最強のハナコのステップで充分対応出来るようになりました。

ですよねー。
実は、僕自身、 Vlookup関数とかピボットテーブルとか覚えたのはマクロを使いこなせるようになってだいぶ経ってからのことでした。
なくても困らなかったので (^^;

>労働時間の集計、氏名のリストアップを含め、演習全てが実務に直結していて翌日には応用出来、マクロの数は数十になっていると思います。

おおお!すばらしすぎ☆

>現在、VBA専用フォルダを作成し、xlsmファイルを格納。必要に応じて別ファイルへの実行を行っているのですが
>その際に注意すべきことはありますでしょうか?

特にないっちゃないですが、ファイルやフォルダごと壊れたりしたときのため、バックアップは作っておくとよいと思います。

ちなみに、僕は、データとマクロを同じファイルに置くのが好みです。
(というか、もしもマクロだけ分離して置いていたら、どのマクロがどのファイル用か分からなくなってしまいそうです)

コードの印刷についてのご質問。
コードウィンドウで [Ctrl] + [P] とか [ファイル] → [印刷] とかでよいかと思いますが、何かそれ以上のことでしょうか?


>以前頂いたPivotを使わずとも、とのお答えはこのことですか?
>簡単なクロス集計位なら、最強のハナコのステップで充分対応出来るようになりました。
>労働時間の集計、氏名のリストアップを含め、演習全てが実務に直結していて翌日には応用出来、マクロの数は数十になっていると思います。
>
>現在、VBA専用フォルダを作成し、xlsmファイルを格納。必要に応じて別ファイルへの実行を行っているのですが
>その際に注意すべきことはありますでしょうか?
>あと書いたコードの印刷の仕方についても教えていただけませんでしょうか。
>
>印刷の仕方については、自宅のプリンターが故障中で試す事が出来ず
>お時間のある時で良いので動画で頂けると嬉しいです。
>


1740 : 受講生さんのコメント (2014-07-16 01:59:03)

以前頂いたPivotを使わずとも、とのお答えはこのことですか?
簡単なクロス集計位なら、最強のハナコのステップで充分対応出来るようになりました。
労働時間の集計、氏名のリストアップを含め、演習全てが実務に直結していて翌日には応用出来、マクロの数は数十になっていると思います。

現在、VBA専用フォルダを作成し、xlsmファイルを格納。必要に応じて別ファイルへの実行を行っているのですが
その際に注意すべきことはありますでしょうか?
あと書いたコードの印刷の仕方についても教えていただけませんでしょうか。

印刷の仕方については、自宅のプリンターが故障中で試す事が出来ず
お時間のある時で良いので動画で頂けると嬉しいです。


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

小俣さん:

> あと、変数の使い方にだいぶ慣れてきました。
> とても便利に使っていけそうです。

分かれば簡単でしょ?(w


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

No10で学んだForループのネストが今回No11できちんと書けました。
さっきつまずいたところをすぐに練習できてとても助かります。

あと、変数の使い方にだいぶ慣れてきました。
とても便利に使っていけそうです。


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

北嶋さん:

> 変数が多くなってくると、分かりやすい変数名じゃない場合は、コードが見づらいし、書きづらいし、何より混乱しますね。

ですね。可読性はいつも重要なポイントです。


332 : 北嶋浩行さんのコメント (2013-09-04 00:00:00)

今回は変数が多くて少し手間取りました。
変数が多くなってくると、分かりやすい変数名じゃない場合は、コードが見づらいし、書きづらいし、何より混乱しますね。
変数の名前付けにも注意しながら課題をやっていこうと思います。


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

平井さん:

> 陥りやすいパターンが確かにある気がします。
> もっともっとさらさら書けるようになりたいと思います。

陥りやすいパターンに気がつけば、さらさら書けるようになるにはもうすぐです (^^


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

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

○おおまかな流れをつかむこと
○その課題に固有の問題に気をつけること
○よく自分がやる間違いに気をつけること

ですね!
陥りやすいパターンが確かにある気がします。
もっともっとさらさら書けるようになりたいと思います。


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

平井さん:

以下を切り分けて考えつつトライしてみてください。

○おおまかな流れをつかむこと
○その課題に固有の問題に気をつけること
○よく自分がやる間違いに気をつけること


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

変数が訳が分からなくなって、動画を確認してから2-3回書き直しました。
でもちゃんと動きました(^^)
毎朝30分続けていれば必ずできるようになりそうな予感があるものの毎日できず、記憶を定着するところまで頑張りたいと思っています。


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

池本さん:

さすが!よかったです。

> end ifの前に+1のパターンの応用ですね。
> sum関数よりおなじみの式じゃないですか~。

はい、まさに (^^

ひきつづき、お楽しみを☆


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

小川先生、みえた!!

計算しおわって初期化する前の数字を使ってるんですね。
最初のkonrui = kobetsu + konruiは、
konrui = 15000 + konruiというよくわからない式だけど、
(ここの+konruiにひっかかっていたとわかりました)
ここの+konruiはとりあえず+0と考えて、
konrui = 15000
次のkonrui=kobetsu + konruiは
konrui = 10000 + 15000 = 25000となるのを
繰り返していって最終的なKonruiが累計になると。

問題2のgoukei = goukei + range("J" & migi).value
と考え方は同じですね。
そしておもとはend ifの前に+1のパターンの応用ですね。

sum関数よりおなじみの式じゃないですか~。

ありがとうございます☆


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

池本さん:

9:20までで konrui の話をしています。そこまでは分かります?

要は、各行について「今月支払額」の計算を完了する都度、

konrui = kobetsu + konrui

という式で konrui に加算していっているだけなんだけど。


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

こんにちは~☆

前回のしそ巻き無料と同じパターンなのに、何回やってもうまくいかなくてもどかしかったです(><)
前回の動画もみなおしましたけど、前回のところまではOKだということはわかったので、今回の動画を何回も見ました。
1個ずつ確認して問題2までは動画が理解できたし、自分でもかけるようになりました。
問題3はギブアップです。
konruiとsouruiのところ、何回見てもわからないです。
sum関数はしっくりとわかりました(^^;)
すっきりしないのでkonrui&souruiのポイントを教えてください。


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

豊島さん:

あー、そうですか。こっちでも解説していましたっけ。
順調に学べているようで、なによりです☆


322 : 豊島 久博さんのコメント (2013-02-24 00:00:00)

今回も、きれいにハナコのステップを踏めなかったけど、何とか正しく動くマクロを作れました。

前回気づいた、変数を初期化する場合としない場合を確認できて、嬉しかったです。


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

山根さん:

そんなに簡単な問題でもないです。
10回とは、なかなかすごいですね。

エラーは、つきものです。エラーが出なくなるというより、エラーが出ても即座に修正できるようになることを目指してください。

インデントについては、発展編フォローメールのうち、中盤に配信するもので解説しています。

今の段階では、青い字の言葉ではじまる入れ物の中は、一段下がる、と覚えておいてください。

たとえば:

Sub hoge() End Sub


とか

Sub hoge()    For hen = 3 to 12     NextEnd Sub



とか

Sub hoge()    If moji = "Yes" Then     Else     End IfEnd Sub


とか。

どの言葉が入れ物のはじまりで、どれが終わりか分かりますよね。
(If文は If と Else との間、, Else と End If との間、と、二カ所に入れ物がありますが)

それが分かれば、たとえば、以下もどう配置すべきか分かるでしょう。

Sub hoge()    Dim hen    Range("A1").Value = 3    For hen = 3 to 12        If moji = "Yes" Then            Range("C" & hen).Value = 2        Else            Range("C" & hen).Value = 1        End If    Next    Range("B1").Value = 3 + 5End Sub


こんなのでも↓。

Sub hoge()    Dim hen    Range("A1").Value = 3    If moji = "Yes" Then        For hen = 3 to 12            Range("D3").Offset(, hen).Value = "OK"        Next        Range("C" & hen).Value = 2    Else        Range("C" & hen).Value = 1    End If    Range("B1").Value = 3 + 5End Sub


その延長で考えれば、前回のものを手直しするのも難しくないのではないかと思います。

分からなければ、ソースを印刷して、対になる言葉を見つけて赤ペンでチェックしてみてください。最後は手を動かした人の勝ちです。


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

ありがとうございます。
これぐらいの問題でも最低10回は実行・修正を繰り返しています。数値が正しくなかったりしまいには構文エラーも出たりでなかなか進まないですが、うまくいった時の感動は気持ちいいです。
インデント、実はよくわかってないんです。
感覚でやっておりますのでご指導いただければと思います。

Sub Q2()
    Dim migi As Long
    Dim hidari As Long
    Dim gk As Long
    Dim kongetu As Long
    Dim ruikei As Long
     
    For hidari = 4 To 9
        For migi = 4 To 10
            If Range("i" & migi).Value = Range("b" & hidari).Value Then
                gk = gk + Range("j" & migi).Value
            End If
            Range("d" & hidari).Value = gk
            Range("e" & hidari).Value = gk + Range("c" & hidari).Value
        Next
        kongetu = kongetu + Range("d" & hidari).Value
        ruikei = ruikei + Range("e" & hidari).Value
        gk = 0
    Next
    Range("d10").Value = kongetu
    Range("e10").Value = ruikei
End Sub


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

山根さん:

追記です。

あと、今回お見せいただいたコード、インデントを直したいですね。
余裕があればインデントを直した状態のものを作り、再度お見せください


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

山根さん:

> Nextとnextの間のコードをEndIfとNextの間に入れると変数gkが使えたんですね。なるほど。

こういうのは、思考だけで答えが分かるというのはむしろ希だと思ってください。
選択肢をいくつか思いつくなかでいろいろ試しているといずれ正解にたどり着く、という感じです。


以下、山根さんには蛇足かとも思いつつも、あとでこのスレッドを読む別の受講生の方への解説という意味も含めて追加で書いておくと。

セミナー本編でも、住所を分割するマクロを作る課題がありましたね。

あのとき、

Range("G2").Value = Mid(Range("C2").Value, ku + 1)


に至るまで、「 + 1 」のところを「- 1」にしてみたりとか、いろいろやったでしょ。
あれと同じ感覚です。

○まずは、書いてから考える
○まずは、実行してから考える
○可能な限りコピペで済ませる

ということを徹底していれば、自ずと答えは見つかります。


317 : 山根信行さんのコメント (2013-01-30 00:00:00)

書いてみて実行すると結果はあってると思うんですが、動画を見るとなんだか記述が違ってました。

Sub Q2()
    Dim migi As Long
    Dim hidari As Long
    Dim gk As Long
    Dim kongetu As Long
    Dim ruikei As Long
     
    For hidari = 4 To 9
        For migi = 4 To 10
            If Range("i" & migi).Value = Range("b" & hidari).Value Then
                gk = gk + Range("j" & migi).Value
            End If
                Range("d" & hidari).Value = gk
                Range("e" & hidari).Value = gk + Range("c" & hidari).Value
        Next
                kongetu = kongetu + Range("d" & hidari).Value
                ruikei = ruikei + Range("e" & hidari).Value
                gk = 0
    Next
                Range("d10").Value = kongetu
                Range("e10").Value = ruikei
     
End Sub

Nextとnextの間のコードをEndIfとNextの間に入れると変数gkが使えたんですね。なるほど。

しかし事務用品の扱いが少しわからずForEachかなと思ったんですが。違いましたか。


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

> 復習で2回目をやってみました。

すばらC!(←死語 ヾ(´ー`)ノ )

> 2回目でもすんなりいかないですが、1回目のときのわからなさよりはずっとマシになったと思います。

まさに、2回目やることの効果! ヾ(´ー`)ノ


> 修正し忘れたり、カッコや.valueが抜けたりします。

修正しわすれ : 「加工する」の問題
カッコが抜ける: お団子の段階でちゃんと動いたのであれば、「加工する」の問題
.Valueが抜ける: 「お団子を作る」の問題

かと思います。


> でも結果がちゃんと間違ったので直せました!

そそ。マクロを書きときの行動の3つのポイントについて、基礎編でお話しましたね。

[1] まずは、書いてから考える
[2] まずは、実行してから考える
[3] 可能な限りコピペで済ませる

実行したから、問題があると即座に分かります。
そして、即座に分かるから、即座に修正できるわけです。


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

復習で2回目をやってみました。
ハナコのステップ「加工する」で抜けもれが出ることが多いです。修正し忘れたり、カッコや.valueが抜けたりします。
箱に入れた後に最初からもう一度音読すると良いんですね。面倒くさがらずにやろうと思います。
それから、二つめの変数を作ってハナコをやるときにどこまで箱に入れて良いかで一瞬悩んでしまいました。
良く考えると最後の行までその変数を使うのだから、全部入れないといけないのですが、一瞬わかりませんでした。
でも結果がちゃんと間違ったので直せました!
2回目でもすんなりいかないですが、1回目のときのわからなさよりはずっとマシになったと思います。


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

佐藤さん:

ですね。繰り返し書くことがすべてです。
身体で身につけてしまってください!!


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

動画と同じように書いて動かすだけでも時間がかかりました~!
分からなくて後でやり直すとまた前にやっていたことを忘れてしまっていたりしていました。
休みが入ると逆に時間が取れなかったので、練習する時間を平日と休日それぞれでうまく作りだすこともとっても大事ですね。
繰り返し書いて練習します。


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

達人養成塾 小川です。

> ”goukei=0”を挿入する場所が何となく分かってきたような気がします・・・

↑そっちを、はっきり分かるまで極めてください。

> とりあえず、累計は使い慣れた”SUM”の方が理解しやすいですね。

↑それをやっている間は、たいして伸びないと思っていてください。

パッケージ化されたツールを使うと、同じ機能のものを自力で実装する手間は省けますが、その分、応用力か利かなくなります。

慣れない人が失敗くり返しながらようやく vba で sum関数を呼び出して使うことに成功している間に今回紹介したようなやり方を自力で実装できるくらいでないと。

..と、たまには厳しいことを書いてみます。


311 : 竹端博希さんのコメント (2012-10-31 00:00:00)

”goukei=0”を挿入する場所が何となく分かってきたような気がします・・・
とりあえず、累計は使い慣れた”SUM”の方が理解しやすいですね。


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

問題1、2は前回の問題の応用なので大丈夫でした。

問題3はSUM関数を使っていいんですね~。
この方が馴染みがあるし、すっきりするから多用しそうです^_^;


309 : 大椛輝志さんのコメント (2012-10-18 00:01:00)

打合せありがとうございました!

作成したマクロ、下記のとおりです。
ひとこと、よろしくお願いいたします!!



Sub zenbu()
Dim hidakoumoku '※左表「項目」
Dim koumoku '※右表「項目」
Dim syousai '※右表「詳細」
Dim kongetu
Dim hgyo '※左行
Dim mgyo '※右行

Dim konruikei ' ←問題3で追加
Dim souruikei ' ←問題3で追加

For hgyo = 4 To 9
kongetu = 0
For mgyo = 4 To 10
hidakoumoku = Range("B" & hgyo).Value
koumoku = Range("H" & mgyo).Value
syousai = Range("I" & mgyo).Value
If hidakoumoku = syousai Then
kongetu = kongetu + Range("J" & mgyo).Value
ElseIf hidakoumoku = koumoku Then
kongetu = kongetu + Range("J" & mgyo).Value
End If
Next
Range("D" & hgyo).Value = kongetu
Range("E" & hgyo).Value = Range("C" & hgyo).Value + kongetu

konruikei = konruikei + kongetu ' ←問題3で追加
souruikei = souruikei + Range("E" & hgyo).Value ' ←問題3で追加
Next
Range("D" & hgyo).Value = konruikei ' ←問題3で追加
Range("E" & hgyo).Value = souruikei ' ←問題3で追加
End Sub


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

ここでSUM関数が出てきますか。SUM関数以外は解けました。
問題3以外は自力です。

Sub mondai1()
Dim goukei
Dim kiroku
For kiroku = 4 To 10

If Range("I" & kiroku).Value = Range("B4").Value Then
goukei = goukei + Range("J" & kiroku).Value
Range("D4").Value = goukei
Range("E4").Value = Range("C4").Value + Range("D4").Value
End If
Next

End Sub

Sub mondai2()
Dim koumoku
For koumoku = 4 To 9
Dim goukei
goukei = 0
Dim kiroku
For kiroku = 4 To 10
If Range("I" & kiroku).Value = Range("B" & koumoku).Value Then
goukei = goukei + Range("J" & kiroku).Value
End If
Next
Range("D" & koumoku) = goukei
Range("E" & koumoku).Value = Range("C" & koumoku).Value + Range("D" & koumoku).Value
Next
End Sub

Sub mondai3()
Dim koumoku
For koumoku = 4 To 9
Dim goukei
goukei = 0
Dim kiroku
For kiroku = 4 To 10
If Range("I" & kiroku).Value = Range("B" & koumoku).Value Then
goukei = goukei + Range("J" & kiroku).Value
End If
Next
Range("D" & koumoku) = goukei
Range("E" & koumoku).Value = Range("C" & koumoku).Value + Range("D" & koumoku).Value
Next
Range("D10").Value = "=sum(D4:D9)"
Range("E10").Value = "=sum(E4:E9)"
End Sub


1242 : 小川慶一の回答 (2012-09-05 23:40:00)

達人養成塾 小川です。


> 自動記録マクロでsum関数の使い方を調べて処理したので
> 関数はあまり使わないというのが意外でした。

そうですねー。まあ、既製品の道具を適用できると物ごとを簡単に処理できることもありますが。
どちらかというと、自分に合う道具を自分で作れることの喜びとか利便性とかのほうが大きいですね。

このあたりは、たくさん書いているとそのうち感じられるものだと思います。


1241 : 受講生さんのコメント (2012-09-05 19:40:00)

No.10と似た処理だったので、特に詰ることなく出来ました。



自動記録マクロでsum関数の使い方を調べて処理したので

関数はあまり使わないというのが意外でした。


1263 : 小川慶一の回答 (2012-09-02 11:38:00)


> 普段、ワークシート関数がVBAでも使えないか?とまず発想する思考パターンがあります。具体的にはWorksheetFunctionオブジェクトの利用です。でも、これだけではプログラムを書くという基本的な考え方にほころびが出るような気がします。

ですね。
worksheetfunctionの代わりになるようなロジックを自分で考えて
実装するくらいの気概があるとよいです。

既存の部品を組み合わせて何かを作る人より、
すべてイチから作る人のほうがやはり強力です。


1262 : 受講生さんのコメント (2012-09-01 19:11:00)

「何度でも値を格納し直せる」変数の扱い方に慣れてきました。逆に言えば、私はこの考え方が不慣れで下手であったと気づかされました。普段、ワークシート関数がVBAでも使えないか?とまず発想する思考パターンがあります。具体的にはWorksheetFunctionオブジェクトの利用です。でも、これだけではプログラムを書くという基本的な考え方にほころびが出るような気がします。Excelの標準機能(ワークシート関数)の知識はVBAではほとんど必要とされない、と小川先生が仰っていたことが少しわかった気がいたします。やはり、全く別のソフト(別の考え方)と認識した方が良さそうですね。



最後に質問です。変数の初期化、よく忘れます。そこで、問題[1]のプロシージャを書いた時点で、

変数=0

の記述を入れておくことについて、どのようにお考えになりますか?


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) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ