Excel VBAでアルファベットの範囲ごとにセルの計算を行いたい

このQ&Aのポイント
  • Excel2003 VBAを使用して、A列にアルファベットが並び、B列とC列に数値が入力されています。A列の指定したアルファベットから次の指定したアルファベットまでの範囲で、B列とC列の値の計算を行い、D列に結果を記入したいです。
  • アルゴリズムが分からず、現在はDo Untilループを使用してA列のセルをチェックしていますが、指定したアルファベットの範囲を特定する方法がわかりません。ランダムに配置されたアルファベットを処理するための解決策を教えてください。
  • アルゴリズムが浮かばず、Excel2003 VBAでA列に配置されたアルファベットの範囲ごとにB列とC列のセルの計算を行いたいです。Do Untilループを使用してA列のセルを確認し、指定したアルファベットの範囲を特定する方法がわかりません。お知恵をお貸しください。
回答を見る
  • ベストアンサー

アルゴリズムで

今エクセルにて簡単なデータ処理をしているのですが、どうしても浮かばないアルゴリズムがあるので、教えて下さい。 Excel2003 VBAにおいて、 A列にアルファベットが並んでいます。 B列、C列には適当な数値が入っています。 Do~LoopにてA列の空白欄までループを回していて、その中で決めたアルファベットが来た時(例えばF)に、そこから次の指定したアルファベット(例えばS)が来るまでB列のセルの数字とC列のセルの数字を足したものをD列のセルに記入します。 決めたアルファベットには規則性はないのですが、一度使った全てのアルファベットが終わるまで来ません。 具体的に描かせてもらうと、A~LまでK~Zまでが分かれており、A~Lはランダムに順に並んでおり、次に順にK~Zまではランダムに並び。全てのアルファベットが終わったら、またらA~Lまでランダムに並び、次にK~Zまで並びます。 これが、何回も続いています。 先の例えに準じて書かせていただくと、Fが来たらそこからB列とC列の計算を始めて、Sが来たらその計算を終える。 また、次にFが来たら、B列とC列の計算を始めてSが来たらその計算を終える。 と言うものです。 これに関して、どうしてもアルゴリズムが浮かびません。 y=1 Do Until Cells(y,1).Value = "" If Cells(y,1).Value = "F" Then … End If y=y+1 Loop と考えたのですが、こうなるとFが来た時だけしか処理をしません。 ランダムに来るFからSの部分を計算するにはどうしたらよいでしょうか? お知恵を拝借させて下さい。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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 が宣言され、デフォルト値に戻るのかも? この辺りは分かりません。 (使う変数は事前に宣言しているので) 検証をお願いします。 で、説明になってたいましたか?

sumaabe
質問者

お礼

早速のお返事ありがとうございます。 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 ●●●=●● ならその部分をだけを計算させる。と言う発想しかなかったです。 フローチャートを頭で浮かべながら考えてみると、なるほどと納得しました。 大変わかりやすいご説明、感謝しております。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#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列作成せず) で説明になっていたでしょうか。

sumaabe
質問者

補足

ありがとうございます。 文の構造などは何となくわかっていたのですが、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)
回答No.1

アルゴリズムというか処理上の手続きのような気がします。 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 ではどうでしょうか。

sumaabe
質問者

補足

早速のお返事ありがとうございます。 このコードを試せていただいたのですが、申し訳ないのですが、少しご説明いただけないでしょうか? 単純に考えてしまうと、If文で”F”ならTrueとしますよね。 その後、”S”ならFalseにしますよね。 なのに、なぜ”F”から”S”までが、Trueとなるのですか? あいにく、手元に本がないので、少々理解に苦しんでおります。 そして、残念ですが、このコードによると、Sが来た時では計算しておらず、Sの手前のアルファベットまでを計算していました。 この場合ですとどのように対処したらよいのでしょうか?

関連するQ&A

  • アルゴリズムについて(ちょい難問だと思います)

    (a,b)が(a>b)かつ(b>=0)を満たすとき x = a; y = b; while(y>0){ r = (xをyで割った余り); x = y; y = r; } return x;  (xを出力) というa,bの最大公約数を求めるアルゴリズムがあるとする。 ここでwhile文の実行回数(while文を行う回数)を L(a,b)とし、 F(n)をフィボナッチ数列とすると、 (つまり、F(0)=0,F(1)=1,F(2)=1, F(n+2)=F(n+1)+F(n) (n>=0)) 「L(a,b)=n」 ならば 「a >= F(n+1)」であることを示せです。 どうフィボナッチとループ回数を比較できるのか? うまく思いつきませんでした・・・ どなたかうまい方法思いついた方お願いします。

  • エクセルのカウントについて

    たとえばA列にa~zのアルファベットが入力してありB列にもa~zのアルファベットが入力してあるとします。A列がfでB列がkである行を数えるにはどうすればいいでしょうか?C列に文字を結合してかぞえればできるのでしょうがなるべくほかのセルに結合などで使いたくなくまたVBAを使いたくないのですが、なにかよい方法はありますか?よろしくお願いいたします。

  • エクセルVBAの入力について

    "Sheet1"のA1、C1、F1、G1の値(計算結果のみ)すべてコピーして、 貼り付ける場所が"Sheet2"のA1:Z10の範囲内で、 A1はB列、C1はG列、F1はH列、G1はZ列の空白セルに上詰めで貼り付ける。 なおF、G、H、Z列以外の列には値が入力されていたり空白もあります。 また同時に、 "Sheet1"のA1、C1、F1、G1の値(計算結果のみ)の内でA1とF1のみコピーして、 貼り付ける場所が"Sheet3"のC1:Y10の範囲とC13:Y23範囲内で、 A1はC列、F1はY列の空白セルに上詰めで貼り付ける。 なおC、Y列以外の列には値が入力されていたり空白もあります。 またC11:Y12の範囲内にはすべて値が入力されています。 よろしくお願いします。

  • エクセルの計算式について教えてください

    エクセルの計算式について教えてください A列にはA~Zまでのアルファベットがランダムに並んでいます。 B列には1~9間での数字がランダムに並んでいます。 C-3 の数 (つまりA列がCでB列が3) がいくつあるかカウントさせる式を作りたいのです。 エクセルでは基本的なことかもしれませんが、まだ十分理解していません。何かエクセル関数理解のお勧めのサイトがあればついでに教えてください。

  • アルゴリズムについての問題

    (1)AとBは正の整数値とする。 (2)A=L,B=Sとして代入する。 (3)L:Sで比較したときにL>Sの場合はL-S→L(矢印は代入を表す)としてL<Sの場合はS-L→Sとする。 (4)どちらかの計算をした後にLとSを比較し、=(イコール)の場合はLとして出力する。 (5)=でない場合は(3)に戻る。LはA,Bに関してどのような関係であるか簡潔に答えよ。 という問題がありました。私はLはAとBの最大公約数と答えました。 あっていますでしょうか?またこのアルゴリズムの名前のようなものがあれば教えてください。

  • 以下の内容でA行目の内容だけ表示させる方法

    ・A行A列目の値とB行A列目は必ず一緒になりますがS1111とは限りません、そしてA行目からZ行目にランダムに配置される可能性があります ・A行B列目の値とC行B列目は必ず一緒になります、これは必ずH11-Yという名称です、そしてA行目からZ行目にランダムに配置される可能性があります 実際はこの内容をVBAに取り込むつもりです、VBA初心者のため分かりやすく教えていただけるとありがたいです   A列  B列  A行 S1111  H11-Y   B行 S1111 H22-R C行 S2222 H11-Y

  • かけ算に関してのアルゴリズム

    アルゴリズムに関して全くの初心者なので、お力を貸してくれると幸いです。 タイトルにもありますが、かけ算を使ってのアルゴリズムですが、足し算なり、引き算なりを使ったほうが効率がいいのですが、どのようにすればいいのか悩んでおります。 x=a*b-c*c+bd y=b*b-cc+a*d と全部で6つののかけ算があります。 新しい変数(例えば、temp=c*c のような)を作ってもかまいませんので、 かけ算の使用回数を3回までに押さえたいのです。 私が考えたのは、 x=b(a+d)-temp y=b(b+a)-temp+a(d-b) ほかに効率の良いアルゴリズムはありますでしょうか? よろしくお願いします

  • 数学(ベクトル)の問題

    http://okwave.jp/qa/q8022847.html のNO.7の回答より、 さらに途中式を書いたのですが、 L^2 = m(t-n(s))^2-(a1^2+b1^2+c1^2 ) {(c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s)/(a1^2+b1^2+c1^2 )}^2+(a2^2+b2^2+c2^2 ){(s^2 )+2s{c2(z2-z1)+b2(y2-y1)+a2(x2-x1)}/{(a2^2+b2^2+c2^2 )} }+{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 } n(s)={c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}/(a1^2+b1^2+c1^2 ) = m(t-n(s))^2-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}^2/(a1^2+b1^2+c1^2 )+(a2^2+b2^2+c2^2 ){(s^2 )+2s{c2(z2-z1)+b2(y2-y1)+a2(x2-x1)}/{(a2^2+b2^2+c2^2 )} }+{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 } = m(t-n(s))^2-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}^2/(a1^2+b1^2+c1^2 )+(a2^2+b2^2+c2^2 )(s^2 )+2s{c2(z2-z1)+b2(y2-y1)+a2(x2-x1)}+{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 } ところで {c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}^2 = {c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}^2 +2{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}(a1a2+b1b2+c1c2)s +{(a1a2+b1b2+c1c2)s}^2 = {c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}^2 +2{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}(a1a2+b1b2+c1c2)s +(a1a2+b1b2+c1c2)^2 (*s)^2 これより、 L^2= m(t-n(s))^2+s^2 {(a2^2+b2^2+c2^2 )-(a1a2+b1b2+c1c2)^2/(a1^2+b1^2+c1^2 )} +s[2{(c2(z2-z1)+b2(y2-y1)+a2(x2-x1))-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}(a1a2+b1b2+c1c2)s/(a1^2+b1^2+c1^2 )}] +{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 }-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}^2/(a1^2+b1^2+c1^2 ) 簡単、 L^2 =m(t-n(s))^2+ps^2+p1s+p2 =m(t-n(s))^2+p(s^2+p1s/p)+p2 =m(t-n(s))^2+p(s^2+p1s/p+(p1/p)^2-(p1/p)^2 )+p2 =m(t-n(s))^2+p(s^2+p1s/p+(p1/p)^2 )-(p1)^2/p+p2 まで、計算したのですが(間違っていたら申し訳ありません)、 ここから、どのように q=-p1/2p が導出できるのかがわからないです。 (rは導出できました。) 数式だらけで分かりづらいと思いますが、計算ミスを指摘しつつ、導出過程も分かりやすくお願いします。

  • マクロについての質問2

    また新たな質問がありますので 質問させてください。宜しくお願いします。 質問内容: A列のデータのあるセルの一つ下のセル行まで、G列の中の空欄を抽出し、"使用不可"と入力したいのですが、 どのように範囲指定すればよいのでしょうか?   A B C D E F G 1 d  t  y  t   e   () ←使用不可 2 r   y  l  f   c s  a 3 y       h   z   () ←使用不可 4             () ←使用不可 こんな表にしたいのですが・・・どうでしょうか?

  • 乗積 Π のアルゴリズム

     はじめまして。  質問内容が表題と多少ズレる事をご承知下さい。  アルゴリズムを教えて頂きたいと思っています。  ************************  Π(2x-1) ,x=1~m  上式においてm=3とすると、総数は15となります。  今、A~Fまで6つのアルファベットがあります。  このうち2つをペアにしてグループを作ります。  上式により、グループ総数は15となります。  ペアの組み方は以下のようになります。  <例>  (1) A-B、 C-D、 E-F  (2) A-B、 C-E、 D-F  (3) A-B、 C-F、 D-E   ・   ・   ・  (14) A-F、 B-D、 C-E  (15) A-F、 B-E、 C-D  ************************  このような取り方をプログラムしようと思うのですが  どこから手をつけてよいかわかりません。  是非アドバイスをお願いします。    

専門家に質問してみよう