- ベストアンサー
Excel VBAでアルファベットの範囲ごとにセルの計算を行いたい
- Excel2003 VBAを使用して、A列にアルファベットが並び、B列とC列に数値が入力されています。A列の指定したアルファベットから次の指定したアルファベットまでの範囲で、B列とC列の値の計算を行い、D列に結果を記入したいです。
- アルゴリズムが分からず、現在はDo Untilループを使用してA列のセルをチェックしていますが、指定したアルファベットの範囲を特定する方法がわかりません。ランダムに配置されたアルファベットを処理するための解決策を教えてください。
- アルゴリズムが浮かばず、Excel2003 VBAでA列に配置されたアルファベットの範囲ごとにB列とC列のセルの計算を行いたいです。Do Untilループを使用してA列のセルを確認し、指定したアルファベットの範囲を特定する方法がわかりません。お知恵をお貸しください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> まだまだ勉強不足なので、私が考えていたIf文は上記のプログラムだと > Cells(y,1).Value が "F"ならばそこだけが、bFound = Trueとなり、 > 結果的には > A - False > H - False > E - False > F - Trueへ - D列作成 > U - False > Boolean型にすると変わってくるのでしょうか? では、基本的な説明になるかどうか?ですが 変数は、誰かが書き換えなければ、その内容は変わりません。 データの型には影響されません。 > F - Trueへ - D列作成 > U - False F の時に bFound を True にしていますが、その後 False にする人は誰でしょうか。 False にする人がいない間は True のままで居続けます。 というのも bFound を宣言しているのが、Do Until より前だから。 以下のような使い方したことがないので、嘘を言っているかもしれません。 bFound の宣言が、 Do Until の内側だったたら? Do Until ・・・ Dim bFound As Boolean ・・・ Loop なら、ループするたびに bFound が宣言され、デフォルト値に戻るのかも? この辺りは分かりません。 (使う変数は事前に宣言しているので) 検証をお願いします。 で、説明になってたいましたか?
その他の回答 (2)
- 30246kiku
- ベストアンサー率73% (370/504)
#1です > Sが来たらその計算を終える > Sが来た時では計算しておらず、Sの手前のアルファベットまでを計算していました S の時も処理をするのであれば以下のようになるのでしょうか If (Cells(y,1).Value = "F") Then bFound = True End If If (bFound = True) Then Cells(y,4).Value = Cells(y,2).Value + Cells(y,3).Value End If If (Cells(y,1).Value = "S") Then bFound = False End If > 少しご説明いただけないでしょうか? 以下のような簡単な例で考えます。(FとSに注目して、その他は適当) (右側はbFoundの値など) A - False H - False E - False F - Trueへ - D列作成 U - Trueなので - D列作成 J - Trueなので - D列作成 I - Trueなので - D列作成 S - Trueなので - D列作成 - Falseへ ※1 O - False N - False ※1は上記に変更した場合 前回のものでは、 S - Falseへ (D列作成せず) で説明になっていたでしょうか。
補足
ありがとうございます。 文の構造などは何となくわかっていたのですが、30246kikuさんのご説明で確信が持てました。 そこで、私がもう少しお聞きしたいのが、なぜ If (Cells(y,1).Value = "F") Then bFound = True End If ならそれ以降がTrueとして処理されているのですか? まだまだ勉強不足なので、私が考えていたIf文は上記のプログラムだと Cells(y,1).Value が "F"ならばそこだけが、bFound = Trueとなり、 結果的には A - False H - False E - False F - Trueへ - D列作成 U - False J - False I - False …と考えていました。 Boolean型にすると変わってくるのでしょうか? 少し混同しています。 できれば、その当たりを多少ご説明いただけたら、理解が深まります。 よろしくお願いいたします。
- 30246kiku
- ベストアンサー率73% (370/504)
アルゴリズムというか処理上の手続きのような気がします。 Dim bFound As Boolean bFound = False y=1 Do Until Cells(y,1).Value = "" If (Cells(y,1).Value = "F") Then bFound = True Else If (Cells(y,1).Value = "S") Then bFound = False End If If (bFound = True) Then Cells(y,4).Value = Cells(y,2).Value + Cells(y,3).Value End If y=y+1 Loop ではどうでしょうか。
補足
早速のお返事ありがとうございます。 このコードを試せていただいたのですが、申し訳ないのですが、少しご説明いただけないでしょうか? 単純に考えてしまうと、If文で”F”ならTrueとしますよね。 その後、”S”ならFalseにしますよね。 なのに、なぜ”F”から”S”までが、Trueとなるのですか? あいにく、手元に本がないので、少々理解に苦しんでおります。 そして、残念ですが、このコードによると、Sが来た時では計算しておらず、Sの手前のアルファベットまでを計算していました。 この場合ですとどのように対処したらよいのでしょうか?
お礼
早速のお返事ありがとうございます。 Do Until ・・・ Dim bFound As Boolean bFound = False ・・・ Loop としてみたら、”F”を見つけた所だけが、計算されていました。 つまり、ループで回っている間に、TrueからFalseに書き換えられたのだと、わかりました。 では、 Do Until ・・・ Dim bFound As Boolean ・・・ Loop としてみたら、結果はきちんと”F”から”S”まで計算されていました。 30246kikuさんのご説明でわかりました。 つまり、全体をFalseとしておいて、その中で”F”が来た時点で、それ以降をTrueに書き換えてしまう。 そして、Trueだったら計算させると言う事だと思いました。 僕の頭の中で、If文は分岐というイメージではなく、 ある状態が来たらその場で処理すると考えていました。 つまり、 If Cells(y,1).Value = "F" Then ●●●=●● ならその部分をだけを計算させる。と言う発想しかなかったです。 フローチャートを頭で浮かべながら考えてみると、なるほどと納得しました。 大変わかりやすいご説明、感謝しております。