- ベストアンサー
VBAのプログラムに関してです
- VBAを使用して、A列の中から特定の条件を満たすセルを探し、関連するセルの値を別の列に記入するプログラムの作成方法を教えてください。
- 具体的には、A列に0~4の数字が順番に繰り返し記入されており、B列には適当な値が記入されています。A列の中から1を探しだして、その1つ上の行の数字が0であれば、その行から1つ戻ったB列の値をC列に記入します。そして、A列の次の0~4の繰り返しで同じ条件の1を探し、その行から2つ戻ったB列の値をD列に記入します。これをA列が空白の行になるまで繰り返し行うプログラムです。
- 例えば、A列が「00011112233400001123334400011111122233400000」となっている場合、それぞれの0~4の塊の最初の1を探し、それに対応するB列の値を求めていきます。上記の例では、実行結果としてC列には「379」、D列には「688」という値が求められることになります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ANo.2です。 それでは、D列には2、6、8と入ればよいのですね? Sub Sample() i = 2 j = 1 Do While IsNumeric(Cells(i, 1)) If Cells(i - 1, 1) <> Cells(i, 1) And Cells(i, 1) = 1 Then Cells(j, 3) = Cells(i - 1, 2) Cells(j, 4) = Cells(i - 2, 2) j = j + 1 End If i = i + 1 Loop End Sub
その他の回答 (4)
- bvltiggeari
- ベストアンサー率76% (33/43)
No.1です。 補足されていたことに気づきませんでした(汗) > 2.エラーがおきてしまうんですよね?あるデータを解析で用いたいのですが1の前に必ず0があるので大丈夫です。 そういうことであればOKです(^^ ソースコードですね? すでにmt2008様が回答されているので不要かもですが 私の作ったのはこのような形です。 Dim aStr As String Dim bStr As String aStr = "00011112233400001123334400011111122233400000" bStr = "12345678912345678912345678912345678912345678" Dim answerStrC As String Dim answerStrD As String Dim beforeAStr As String For i = 1 To Len(aStr) For j = 1 To Len(bStr) If i - 1 > 0 And Mid(aStr, i, 1) = "1" And beforeAStr <> Mid(aStr, i, 1) Then answerStrC = answerStrC & Mid(bStr, i - 1, 1) End If If i - 2 > 0 And Mid(aStr, i, 1) = "1" And beforeAStr <> Mid(aStr, i, 1) Then answerStrD = answerStrD & Mid(bStr, i - 2, 1) End If beforeAStr = Mid(aStr, i, 1) Next j Next i aStrとbStrと特定のセルから取得したい場合は aStr = Range("A1").Value ' (取得したいセル) とかしてあげればいいかと思います。 同様に結果をセルに書きたいのであれば Range("A1").Value = answerStrC とかしてあげて下さい。 aStrが提示されたAの値 bStrが提示されたBの値 answerStrCが提示されたCの値 answerStrDが提示されたDの値 です。 これであってるでしょうか?
お礼
回答ありがとうございます。 これでも実行可能でした、ありがとうございます
- mt2008
- ベストアンサー率52% (885/1701)
ANo.2です。 > ちなみにE列にはなんの値が入っているんですか? C列は、最初の0~4の塊が対象。1…セルA4、2…セルA8、3…セルA10 なので、1つ上の行のB列の値が、3(セルB3)、7(セルB7)、9(セルB9)。 D列は、2つ目の0~4の塊が対象。1…セルA17、2…セルA19、3…セルA20 なので、2つ上の行のB列の値が、6(セルB15)、8(セルB17)、9(セルB18)。 E列は、3つ目の0~4の塊が対象。1…セルA28、2…セルA34、3…セルA37 なので、3つ上の行のB列の値が、7(セルB25)、4(セルB31)、7(セルB34)。 と、解釈したのですが違いましたか?
お礼
質問が悪かったようですね、すいません。 それぞれの0~4の塊の最初の1のみを対象として1つ前(C列)2つ前(D列)を出力してほしいです。 なのでC列にはB3、B16、B27の値が、D列にはB15、B26の値がはいってほしいです。
- mt2008
- ベストアンサー率52% (885/1701)
説明が少ない上に例が紛らわしいので混乱しましたが、こういう事でしょうか? また、D列に入るのは6、8、9では? サンプルなのでエラー処理等一切入っていません。悪しからず。 Sub Sample() i = 2 j = 1 vAdown = Cells(1, 1) Do While IsNumeric(vAdown) vAup = vAdown vAdown = Cells(i, 1) If vAup <> vAdown Then Select Case vAdown Case 0 j = j + 1 Case Is < 4 Cells(vAdown, j + 2) = Cells(i - j, 2) End Select End If i = i + 1 Loop End Sub
お礼
回答ありがとうございます。分かりずらくてすいません。 ちなみにE列にはなんの値が入っているんですか?
- bvltiggeari
- ベストアンサー率76% (33/43)
こんばんわ! 面白そうなので考えてみました。 ですが、 > プログラムを教えてほしいです。 これはプログラムの考え方でしょうか? それともソースコードでしょうか? いきなり回答しちゃうと「考え方のヒントが欲しかったのに」 と思われかねないので、聞いてから回答します(^^; できたらヒントから考えてほしいですね! それと、次のことが知りたいです。 1.VBAはどの程度ご存知なのか。 2.仮にAの数字の最初が1の場合はどうしたいのか。 2、これはプログラムをするうえで必要な情報です。 理由は分かりますか? ちなみに作ったプログラムの結果と、実際に数えてもみましたが Dは「688」ではなく「268」ですよね?
補足
回答ありがとうございます。言葉足らずで申し訳ないです。 ソースコードを教えてほしいです。 1.VBAはまだかじった程度であまり理解は深くありません 2.エラーがおきてしまうんですよね?あるデータを解析で用いたいのですが1の前に必ず0があるので大丈夫です。 これはグラフの傾きを求めるために最初の0の次にある1の1つ前の値(C列に出力)と2つ目の0の次にある1の2つ前の値(D列に出力)をだしたいんです。これを繰り返し行うことで区間で区切って傾きをだしたいと考えてます。
お礼
ありがとうございます!