エクセルVBA入力パターンごとの結果

このQ&Aのポイント
  • エクセルVBAを使用して、入力パターンごとの結果を自動化する方法について調べています。データの量が大きくなるため、関数を使用すると重くなってしまいます。そこで、マクロを使って解決しようと考えていますが、うまくいきません。アドバイスをいただけると助かります。
  • D列の5行目から10000行目までに特定の条件に基づいて入力された場合の結果を求めたいです。パターン1では、特定の数字が入力されると、同じ行の特定の列に自動入力されるようにしたいです。また、パターン2では、特定の数字が入力された後に、別の列に特定の値が自動入力されるようにしたいです。解決策を教えていただけると幸いです。
回答を見る
  • ベストアンサー

エクセル VBA 入力パターンごとの結果

関数でもできると思うのですが、データが膨大ですごく重くなります。できたらマクロでと思ったのですが、自分ではうまくできませんでした。よろしくお願い致します。 D列5行目から、10000行目までに以下の条件で入力された場合の結果です。 【パターン(1)】 ・”1”と入力された場合、(同じ行の)GからS列までに、”1”と自動入力。 ・”2”と入力された場合、(同じ行の)GからT列までに、”1”と自動入力。 ・”3”と入力された場合、(同じ行の)HからU列までに、”1”と自動入力。 ・”4”と入力された場合、(同じ行の)IからV列までに、”1”と自動入力。 と各種パターンがあります。 【パターン(2)】 各行にパターン(1)が入力されたあと、以下の条件を加えたいのです。 E列5行目から、10000行目までに以下の条件が入ります。 ・”1”と入力された場合、(同じ行の)I列は”0”に入力が変わる ・”2”と入力された場合、(同じ行の)J列は”0”に入力が変わる。 ・”3”と入力された場合、(同じ行の)K列は”0”に入力が変わる ・”4”と入力された場合、(同じ行の)L列は”0”に入力が変わる

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.3

■コードの登録・仕様 シート右クリック→コードの表示でVBEを開き以下のVBAコードを貼り付けてください。 D列またはE列に「1」~「4」が入力されたら【パターン(1)】、【パターン(2)】の動作をします。 (一括での範囲コピー、貼付にも対応しています) ■VBAコード Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long Dim j As Long Dim ptn1() As Variant Dim ptn2() As Variant ptn1 = Array("G1:V1", "G1:S1", "G1:T1", "H1:U1", "I1:V1") ptn2 = Array("I1", "J1", "K1", "L1") Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual On Error GoTo era For j = Target(1).Column To Target(Target.Count).Column   If j = Cells(1, "D").Column Or j = Cells(1, "E").Column Then     For i = Target(1).Row To Target(Target.Count).Row       If 5 <= i And i <= 10000 Then         Select Case j         Case Cells(1, "D").Column           Range(ptn1(0)).Offset(i - 1).ClearContents           If Cells(i, j).Value <> "" Then             Range(ptn1(Cells(i, j).Value)).Offset(i - 1) = 1           End If         Case Cells(1, "E").Column           If Cells(i, j).Value <> "" Then             Range(ptn2(Cells(i, j).Value - 1)).Offset(i - 1) = 0           End If         End Select       End If       DoEvents     Next i   End If Next j era: Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True End Sub

yuu1236
質問者

お礼

大変、遅れて申し訳ありません。ありがとうございました。

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.1です。 >E列5行目から、10000行目までに以下の条件が入ります を見逃していました。 すべてD列の処理だと勘違いしていましたので、 前回のコードはきれいに消去して↓のコードに変更してください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range If Intersect(Target, Range("D5:E10000")) Is Nothing Or Target.Count > 1 Then Exit Sub With Target If .Column = 4 Then Range(Cells(.Row, "G"), Cells(.Row, "V")).ClearContents Select Case .Value Case 1 Range(Cells(.Row, "G"), Cells(.Row, "S")) = 1 Case 2 Range(Cells(.Row, "G"), Cells(.Row, "T")) = 1 Case 3 Range(Cells(.Row, "H"), Cells(.Row, "U")) = 1 Case 4 Range(Cells(.Row, "I"), Cells(.Row, "V")) = 1 End Select Else If WorksheetFunction.Count(Range(Cells(.Row, "G"), Cells(.Row, "V"))) Then Set c = Range(Cells(.Row, "G"), Cells(.Row, "V")).Find(what:=0, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then c = 1 End If Select Case .Value Case 1 Cells(.Row, "I") = 0 Case 2 Cells(.Row, "J") = 0 Case 3 Cells(.Row, "K") = 0 Case 4 Cells(.Row, "L") = 0 End Select End If End If End With End Sub ※ 今回はE列数値が変わっても対応できるようにしてみました。m(_ _)m

yuu1236
質問者

お礼

大変、遅れて申し訳ありません。ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

G列 Dが1または2の時1,それ以外""  =IF(OR(D5=1,D5=2),1,"") H列 Dが1,2,3の時1,それ以外""  =IF(OR(D5=1,D5=2,D5=3),1,"") I列 Dが1の時0,Dが2,3,4の時1,それ以外""  =IF(D5=1,0,IF(AND(1<=D5,D5<=4),1,"")) J列 Dが2の時0,Dが1,3,4の時1,それ以外""  =IF(D5=2,0,IF(AND(1<=D5,D5<=4),1,"")) K列 Dが3の時0,Dが1,2,4の時1,それ以外""  =IF(D5=3,0,IF(AND(1<=D5,D5<=4),1,"")) L列 Dが4の時0,Dが1,2,3の時1,それ以外""  =IF(D5=4,0,IF(AND(1<=D5,D5<=4),1,"")) M列 Dが1から4の時1,それ以外""  =IF(AND(1<=D5,D5<=4),1,"") N~S列 M列と同じ  =M5 T列 Dが2から4の時1,それ以外""  =IF(AND(2<=D5,D5<=4),1,"") U列 Dが3又は4の時1,それ以外""  =IF(OR(D5=3,D5=4),1,"") V列 Dが4の時1,それ以外""  =IF(D5=4,1,"") それぞれ以下コピー この程度の計算であれば,仮に毎回1万行ずつ一斉に記入しても,負担を感じることはありません。 仮に回答通りに作成しそれでも「重くて困ってる」のでしたら,シートのどこかにある,今回のご相談では触れられていない別の数式が原因です。

yuu1236
質問者

お礼

大変、遅れて申し訳ありません。ありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに ↓のコードをコピー&ペースト → Excel画面に戻り、D列に数値を入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim myRng As Range If Intersect(Target, Range("D5:D10000")) Is Nothing Or Target.Count > 1 Then Exit Sub With Target Select Case .Value Case 1 Set myRng = Range(Cells(.Row, "G"), Cells(.Row, "S")) If WorksheetFunction.Count(myRng) Then Cells(.Row, "I") = 0 Else myRng = 1 End If Case 2 Set myRng = Range(Cells(.Row, "G"), Cells(.Row, "T")) If WorksheetFunction.Count(myRng) Then Cells(.Row, "J") = 0 Else myRng = 1 End If Case 3 Set myRng = Range(Cells(.Row, "H"), Cells(.Row, "U")) If WorksheetFunction.Count(myRng) Then Cells(.Row, "K") = 0 Else myRng = 1 End If Case 4 Set myRng = Range(Cells(.Row, "I"), Cells(.Row, "V")) If WorksheetFunction.Count(myRng) Then Cells(.Row, "L") = 0 Else myRng = 1 End If Case "" Range(Cells(.Row, "G"), Cells(.Row, "V")).ClearContents End Select End With End Sub 'この行まで ※ 一旦各行に「1」が表示されている状態でD列数値を色々返ると「0」が異なる列に表示されますので、 Deleteで削除するととりあえず「1」はすべて消えるようにしています。 ※ 一発で解決!とはいかないと思いますが、 たたき台としての一例です。m(_ _)m

yuu1236
質問者

お礼

大変、遅れて申し訳ありません。ありがとうございました。

関連するQ&A

  • excel VBA について

    画像のようにexcelファイルのD列に自動で通番を入力させたい。 フォームを利用して新しいデータは最終行に反映するように設定しています。 できれば、フォームの登録を押した時点でD列最終行に画像条件にあう通番を入力させたいのですがどうすればいいかわかりません。 今は、D列セルにCOUNTIFを使って条件を検索して通番を表示させているのですが、日々行が増え続けるためファイルが非常に重たくなってきたのでマクロにチャレンジしました。 マクロの知識はほとんどありません! よろしくお願いします。

  • Excel VBAにてSUMIF関数の入力

    Excelのあるシートに以下の表があります。     E列 ・・・・・・ F列 ・・・ G列 17行 2008/1/5 ・・ 売上 ・ 1,500 18行 2008/2/10 ・・売上 ・ 2,100 19行 2008/3/11 ・・売上 ・ 1,700 20行 2008/3/18 ・・売上 ・ 1,000 21行 2008/4/1 ・・・売上 ・ 2,500 23行 2008/3/15 ・・・・・・・ 3,500 この場合G23セルには=SUMIF(E17:E21, ">" & E23,G17:G21) という式が入っており、結果的に3,500という数字が見えます。 しかし、このG23セルにマクロにて式を書込み同じ3,500という 値を出したいのですが、マクロ上では何と記述すれば同じに なるのか教えて下さい。 例えばrange("G23").Fomula= "=SUMIF(E17:E21, ">" &E23,G17:G21) と記述してもエラーになってしまいます。

  • Excel 入力された間のセルを自動で塗る方法

    以下のように 各行で「A」と「B」を入力後、 その間のセルを自動で塗る方法があれば教えて下さい。 「A」と「B」の位置は自由に変更可能とします。    1 2 3 4 5 6 7 ・・・ 1行 A 塗 塗 塗 塗 塗 B 2行 A 塗 B 3行     A 塗 塗 B この場合、「条件付き書式」でできますか? マクロ・VBAを使用しないと無理でしょうか? 「条件付き書式」でできなければあきらめます・・・ どうぞよろしくお願いします。

  • セルへの入力

    A列、1行から指定した行までに次のような処理をVBAをもちいて行いたいのですが教えてください。 A 1 01 2 02 3 03 : 11 11 12 12 13 01 14 02 15 03 : 23 11 24 12 : : 具体的には、各行に01から12を入力するのを繰り返すようにマクロを書きたいのですが。

  • [エクセル]処理結果を残して次の処理をさせるには?

    AシートのB~G列の各セルには数値が入っており、全部で数百行あります。 Bシートには、いろいろとデータ処理させる作業用のシートとなっております。 Bシートでは、6つの数字を入力するセルに数値を入力する事でデータ処理がされ、Bシート上で結果が算出されます。 現在はBシートに、Aシートの各行のB~G列の6つの数値を入力してデータ処理をして、結果を算出させています。 ですが、Aシートには数百行もあるので、1行1行の数値を入力して処理させていては時間と労力がかかってしまうので、一気に処理できる方法はないか考えていますが、良いアイディアがありません。 AシートのI列の各行に、Bシートでの処理結果をまとめて算出させる方法はないでしょうか? 例えばAシートのB~G列の各行に 1,2,3,4,5,6 7,8,9,1,2,3 4,5,6,7,8,9 と入力されているとします。 Bシートでは、各行の数字を足す処理をさせるとします。(実際はもっと複雑な処理をさせています) 一気にAシートにBシートでの処理結果を表示させたいと思ってます。 1,2,3,4,5,6,21 7,8,9,1,2,3,30 4,5,6,7,8,9,40 何か良い方法はないかと、ずっと考えているのですが、思い付きそうもなかったので、こちらで質問させて頂く事にしました。 アドバイスをお願い致します。

  • 値の入力をexcelのマクロでできますか?

    教えてください。 excel2003です。 あるワークブックのフィルタした値を、違うワークブックの指定した列の最後の行に入力したい。 「ワークブックA」 商品名      シャンプー あ        0.05 い         3.5 う         65 え        5.5 という入力があったとします。 これとは別に、 「あ」「い」「う」「え」それぞれ別のブックがあります。 「あ」のブック G列に”シャンプー”、 I 列に”0.05” 「い」のブック G列に”シャンプー”、 I 列に”3.5” 「う」のブック G列に”シャンプー”、 I 列に”65” 「え」のブック G列に”シャンプー”、 I 列に”5.5” と値を入れたいのですが、どのようにマクロを組めば良いのでしょうか? ご教授ください。 宜しくお願い致します。

  • エクセル VBA

    最近マクロの勉強を始めたばかりの初心者で、どうしても Loop 処理の構文が理解出来ません。 S列 T列 U列  0  0  0 10  5  8  0  4  0   ・  ・   ・   ・  ・   ・ 上記のようにS列(3行目)からU列(最終行変動)に0~20000位の値が入っていて、データの並び替えでS列(昇順)で並べ替えをした後、S列の値が0の場合のみS~T列をDelete Shift:=xlUP したいです。 もしくはS列が0の場合のみT列まで選択 Range("S3:U...") とし、S列が0の行をまとめて Delete Shift:=xlUp したいです。 並べ替えまでマクロすぐ出来たのですが、Loop For Next など構文が理解できません。 どなたかお知恵をお貸し下さい。

  • エクセル マクロのキー入力

    マクロ初心者です、過去の質問を調べたのですが、VBAでキー入力の処理が解りません。 今は、C列~H列とU列に数字を入力してからVBAを実行していますが、H~Uへ移るのに→で移動しています。 毎回面倒なので、最初に入力してU列を入力してからそのまま今のマクロを実行したくなりました、が、VBAでキー入力の処理が解りません。 Office2000ParsonalなのでマクロでVLOOKUPは使えませんが、行と列の移動は変数を使って出来ますので、そういったことは省いて頂いて結構です。 よろしくお願いします。

  • エクセル VBAで入力

     エクセル初心者です。 条件付き書式で一つのセルに特定の文字列を入力した際に、そのセルと任意の法則性のある複数のセルに(入力内容は無関係でセルの行・列に法則性があります)特定の塗りつぶしを行いたいのですが、どのようにすればよいのでしょうか。 条件付き書式をすべて設定する(手打ち)するのが最も確実で間違いの内方法ではありますが、新規に行・列を挿入した場合、その行・列には条件付き書式が設定されていませんので、意図した作用を起こさなくなってしまいます。 上記ではよくわからないと思いますので、具体的な例を入れさせていただきます。 例)) 任意のセル(A13)に特定の文字列(OK)と入力する。 特定文字列に反応して、そのセルの列に(A12からE12、F12からH12)赤色の塗りつぶしを入れる。 上記は1セルに対して行われますが、VBAを使用してA12からA5000までを検索対象として持たせて、それぞれのセルの列に対して塗りつぶしを入れられるようにしたいと思っています。

  • エクセルVBAについて

    以下の処理をマクロで実行しようと思っていますが、わからない部分があるので教えてください。 (例):  A B C D E F G 1 1 2  3  4 5  6  7 2 10 30 50 70 90 130 150 3 4 (1)1行目のどこかの連続したセル(例えばセルA1から セルD1)をドラッグする。 (2)マクロを実行する。 (3)セルA4に、「D2-A2」を計算した値が自動的に入力 される。この例では「70-10=60」  これは、(1)で例えばセルB1からF1をドラッグした場 合には、「F2-B2」を計算した値を入力したいので す。   要は、連続したセルを選択してその始点と終点のセルの行と列を取得できればこの処理はできると思うのですが、方法が分かりませんので教えてください。 よろしくお願いします。

専門家に質問してみよう