マクロでデータが入力されたら同じ行に式を書き込む

このQ&Aのポイント
  • 毎日少しずつ進めているマクロの作成について質問があります。
  • 質問の内容は、指定した行数にデータが入力されたら同じ行に式を書き込むというものです。
  • 具体的には、A1セルに行数を指定し、C2から指定行数の範囲内でデータが入力された場合、D列の同じ行に式を書き込むという処理を行いたいです。
回答を見る
  • ベストアンサー

マクロ データが入力されたら同じ行に式を書き込む

よろしくお願いします。作りたいマクロがあって、毎日少しずつやっています。 自分でも、やりたいことがうまく説明できていないかも知れませんが その際には、補足説明いたしますので、どなたか教えてください A1には行数を指定する数値が入力されています 例 5 A1に入力してある数値をマクロでチェックします 1以上20以下の整数値なら(1)以降の処置をします それ以外の数値なら無視してなにもしません (1)C2からA1で指定した行数の範囲で数値が入力されたら(2)をします 例 A1が5なら 入力範囲はC2からC6になります (2)Dの同じ行に式 =$A$2*(1)で入力された数値 をマクロで書き込む 例C2に数値が入力されたらD2に式をマクロで書き込みます (1)で範囲外にデータが入力されたら何もしません(無視します) 以上です。よろしくお願いします

  • maamaa
  • お礼率85% (274/322)

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

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

No.1・2です。 NO.2の件について (1) データが入力されたセルの2つ右のセル(B7で入力されたらD7)にB7で入力されたデータに   次の文字列を加えて書き込みます 頭にAAA しっぽにBBB   仮にB7で3600が入力されたらD7には AAA3600BBBを書きこみます 「AAA」とか「BBB」は変化セルに列に関係なく常に同じ文字でよいのですね? (3) 入力範囲(仮にB7からB9)のどれかのデータが削除されたら、右側のCからNの行のデータをすべ  て削除します 「変化したセルの右隣りから12列分を消去」という解釈です。 コード内に若干のコメントを入れておきますので、参考にしてみてください。 今回もシートモジュールです。 Private Sub Worksheet_Change(ByVal Target As Range) '▼変数の宣言 Dim str As String, c As Range, myRng As Range On Error Resume Next '←C3~C5データが消去された場合のため★ '▼変化したセルの・・・ With Target '▼C3:C5セル以外、もしくは範囲内でも複数セルが変化した場合は何もしない If Not Intersect(Target, Range("C3:C5")) Is Nothing And Target.Count = 1 Then '▼変化したセルが C3・C4・C5のいずれかによって処理を分岐 Select Case .Row Case 3 If Not UCase(StrConv(.Value, vbNarrow)) Like "[A-F]" Then MsgBox "A~Fまでのセル番号をアルファベットで入力してください。" .Select Exit Sub End If Case 4 If Not IsNumeric(.Value) Then GoTo eH1 ElseIf .Value <> Int(.Value) Or .Value < 7 Or .Value > 50 Then GoTo eH1 End If Case Else If Not IsNumeric(.Value) Then GoTo eH2 ElseIf .Value <> Int(.Value) Or .Value < 1 Or .Value > 100 Then GoTo eH2 End If End Select End If '▼ str に C3の列番号、C4の行番号を文字列として格納 str = StrConv(Range("C3"), vbNarrow) & Range("C4") '▼ myRng に セル番地「str」からC5セルの行数分の範囲を格納 Set myRng = Range(str).Resize(Range("C5").Value) '▼ 変化セルが myRng 以外の場合は何もしない If Intersect(Target, myRng) Is Nothing Then Exit Sub '▼ 変化セルを myRng内でループ(複数セルを一気に消去した場合も対応するため) For Each c In Target '▼ 変化したセルが空白以外の場合 If c <> "" Then If Not IsNumeric(c) Then GoTo eH3 Else c.Offset(, 2) = "AAA" & .Value & "BBB" c.Offset(, 5) = "CCC" & .Value & "DDD" End If '▼ 変化セルのデータが消去された場合(空白の場合) 'その行の1列右隣りのセルから12列分のデータを消去 Else c.Offset(, 1).Resize(, 12).ClearContents End If Next c Exit Sub eH1: MsgBox "7~50の整数を入力してください。" .Select Exit Sub eH2: MsgBox "1~100の整数を入力してください。" .Select Exit Sub eH3: MsgBox "数値を入力してください。" .Select End With End Sub ※ 今回もC3~C5が変化した場合、元々表示されているデータには手を付けていません。 こんな感じではどうでしょうか?m(_ _)m

maamaa
質問者

お礼

お陰様で、希望する動作のマクロでシートが完成しました マクロは全く未知の世界だったのですが、少しだけ理解できるようになりました 何度も親切に教えていただまして大変感謝いたしております ありがとうございました

maamaa
質問者

補足

大変お世話になっております。動作確認しました。正常に動いております これから c.Offset(, 2)="式" c.Offset(, 3)="式" c.Offset(, 4)="式" こんな感じで式を入れていきます。 マクロに比べれば、式は時間をかければできるので、土日で仕上げて月曜日から仕事で使います 見ず知らずの私にここまで教えていただいて大変恐縮です 昔、N88ベーシックとビジュアルベーシックの初歩の経験があって マクロもなんとかなると思って引き受けたのですが甘かったです また、今回は注釈を入れていただきまして勉強しやすくなって助かります。 結果はお礼で報告させていただきます 何度もお手数をおかけしました、ありがとうございました。

その他の回答 (2)

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

No.1です。 補足を拝見しました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range If Intersect(Target, Range("A1,C2:C21")) Is Nothing Then Exit Sub With Target If .Column = 1 Then If IsNumeric(.Value) Then If .Value <> Int(.Value) Then MsgBox "整数を入力してください。" .Select Exit Sub End If End If Else For Each c In Target If c.Row <= Range("A1") + 1 Then If c <> "" Then c.Offset(, 1).Formula = "=" & .Address(False, False) & "*A2" Else Range(Cells(c.Row, "D"), Cells(c.Row, "K")).ClearContents End If End If Next c End If End With End Sub ※ 細かい検証はしていません。 A1セルの値が変わった時にC・D列に表示されているデータと数式は消去するのかどうか? 消去しない場合でも、A1セル数値の行より後ろの行のデータの処理はそのままで良いのか? 等々色々問題点も出てくると思います。 本来であれば考えられるエラーに対しての処理が必要なのでしょうが とりあえずはこの程度で・・・m(_ _)m

maamaa
質問者

お礼

お世話になっております。補足が書けないので、お礼に書かせていただきます また、私がやっていることは質問ではなくて、マクロの作成依頼になっています これはtom04さんに大変な負担をかけているのをお詫びします お手数かけて誠に申し訳ありません 作成していただいたマクロは希望する操作ができています 教えてもらったマクロを1行ずつネットで調べて、自分がやりたいことに直そうと一晩やって見ましたが 手に負えません シートのスタイルが決まりましたので、度々の依頼で失礼ですが、下記のように直してもらえないでしょうか データを入力する列はC3を参照します 仮にBとします 入力制限はAからFです 制限を外れていたらメッセージボックスで警告します データを入力する行はC4を参照します 仮に7とします 入力制限は7以上50以下です 制限を外れていたらメッセージボックスで警告します データを入力する行数はC5を参照します 仮に3とします 入力制限は1以上100以下です 制限を外れていたらメッセージボックスで警告します この場合、入力範囲はB7から3行ですからB9になります この入力範囲(仮にB7からB9)でデータが入力されたら1以下の処理をします データの入力制限はありません 入力範囲(仮にB7からB9)外で入力されたらなにもしません 1 データが入力されたセルの2つ右のセル(B7で入力されたらD7)にB7で入力されたデータに   次の文字列を加えて書き込みます 頭にAAA しっぽにBBB   仮にB7で3600が入力されたらD7には AAA3600BBBを書きこみます 2 同じく5つ右のセル(B7で入力されたらにG7)のセルにCCC3600DDDを書き込みます 式でも可能ですがマクロで書き込みます 3 入力範囲(仮にB7からB9)のどれかのデータが削除されたら、右側のCからNの行のデータをすべ  て削除します 作りたいマクロは以上です また、お願いしていいでしょうか

maamaa
質問者

補足

ありがとうございます。 仕事で遅くなりました。これからやってみます。

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

こんばんは! >(2)Dの同じ行に式 =$A$2*(1)で入力された数値 をマクロで書き込む >例C2に数値が入力されたらD2に式をマクロで書き込みます あらかじめD列に数式を入れてはいけない訳ですね。 (C列に入力があった行のみD列に数式を入れる) ↓のコードをシートモジュールにコピー&ペーストして A1・C列にデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim str As String If Intersect(Target, Range("A1,C:C")) Is Nothing Or Target.Count > 1 Then Exit Sub With Target If .Value <> "" Then If .Column = 1 Then If IsNumeric(.Value) Then If .Value = Int(.Value) And .Value > 0 And .Value <= 20 Then Range(Cells(.Value + 2, "D"), Cells(21, "D")).ClearContents End If End If Else If Range("A1") = Int(Range("A1")) Then If .Row >= 2 And .Row <= Range("A1") + 1 Then str = .Address(False, False) .Offset(, 1).Formula = "=" & str & "*A1" End If End If End If Else Range("D2:D21").ClearContents End If End With End Sub ※ 一発で解決とはいかないと思いますが。 たたき台としての回答です。m(_ _)m

maamaa
質問者

補足

何度も教えていただきまして誠に申し訳ありません 専属講師常態になってしまって大変恐縮しております .Offset(, 1).Formula = "=" & str & "*A2" かけ算の元の数値がA2に有りますのでA2に直して実行しました 私の希望の動作と計算結果になっております ただ、大変申し訳ありませんが、問題点として C列のどこでもデータを削除するとD列の計算結果がすべて削除されてしまいますので 恐縮ですが、A1で指定した行数内のC列のデータの一部が削除された時のみ その右側のD列からK列までのデータを削除するように出来ますでしょうか A1(行数の指定)が3の時は、入力範囲(無視しない範囲=計算する)はC2からC4になります これはうまく行っています もしこのとき、C2からC4の範囲で値がクリアーされたら その右側の列のDからKまでの値をクリアーしたいのですが可能でしょうか? 教えていただく身分で大変恐縮です

関連するQ&A

  • Excel関数をマクロで入力するには?

    例えば次のような表があります。   A   B    C   D 1 金子 横浜 150  150 2 前田     200 3 石田 千葉 100  100 セルD1には =IF(B1="","",C1) セルD2には =IF(B2="","",C2) セルD3には =IF(B3="","",C3) このD列にマクロにてD1から順番に上の式を書込たいのですが、 ここでは、初めからできている式をコピーするのではなく、あく まで上の式を書き込みたいのです。そこで次のようなマクロで やってみましたがうまくいきません。どうマクロを記述したら 良いのでしょうか。 range("D" & 行数 ).Fomula= " =IF(B" & 行数 & "="","",C" & 行数 & ")" こうすると結果はD1にFALSEと表示され入力された式をみてみると =IF(B1=",",B1)となってしまいます。""が"になってしまい、 きちんと=IF(B1="","",C1)となるにはどうすれば良いのか教えて ください。

  • Excelのマクロを使わず、数式内のセル指定範囲をダイナミックにすることはできますか?

    Excelで数式内に範囲を指定するときに、先頭と最後尾のセル番地を指定しますが、他のセルで指定した数値を指定したセル番地の行数に指定することはできますか? 例えば、以下のようなサンプルにおいて A B C D 1 10 2 4 2 32 3 42 4 20 5 17 6 =sum(A2:A4) C1番地に2、D1番地に4を入力すると自動的に A6番地でA2~A4の範囲を指定して足し算してくれるようなことをマクロを使わずに実現できるでしょうか?

  • マクロが実行されるセル範囲の変更を簡素化したい

    excel 2016を使っています。 例えば、ボタンを押すと指定したセルA1~A10までに入力されている数値を昇順に並べ替えるマクロがあるとします。 この数値が入力されているセルA1~A10の範囲をドラックして、D1~D10の位置に移動すると、マクロが実行される範囲を新たにD1~D10に指定しないとならないのですが、マクロが実行される範囲をA1~A10の範囲に固定して、別の場所に移動してもマクロを修正しなくても良い方法はありますか。

  • マクロで複数のセルに数値を入力したい

    エクセル、マクロとも初心者なのですが、タイトル通りのことをするにはどうしたらよいか教えてください。 やりたいことは、 「指定したアクティブセル(毎回変わる)を選択し、その隣のセルにあらかじめ決められた数値をマクロで入力する」というものです。 例えば・・・ A1をアクティブにし、マクロを実行する B1、C1、D1、E1のセルに決められた数値が入力される こんな感じです。 基本的なことかもしれませんが、どうかよろしくお願いします。

  • シートの行並びの値を別のシートの列にコピーする式は

    あるシートに並んでいる行数値を別シートの列に並べる関数を教えていただけませんか (例)シート1      A   B   C   D 12   48 38  15  39 上記A12 に48 B12に38 C12に15と並んでいる数値を別のシートに列に並びかえる式は? シート2   A 1 48 2 38 3 15 4 39 と行った様にする関数を教えてください。単に数値だけなら                  行と列の並び替えでできますがそうではなくシート1に数値を入力                  することにより関数によって自動的にシート2に数値を表したい。                  

  • エクセルで三行ごとのデータを1行ごとに表示させたい

    下のように三行ごとにあるセルを参照し、他のセルに一行ごとに表示する方法(関数、もしくはマクロなど)   A B C D 1 あ     あ 2       い 3        4 い 5 6 7 う 8 あるいはあるセルに入力されている数値を数式内の行、または列として指定する方法を探しています。 (たとえばA1に4、A2に3と入力されていたとき、B2でその数値を取得しC3の内容を表示する、といった感じです) 簡単そうなきがするのですが私の検索が悪いのか、見つけることが出来ませんでした。ご存知の方お願いします

  • マクロ NO番号・上からの行で入力したい。

    マクロを使い。自動でNO番号とSheet2に上からの行で入力させたいです。是非、方法を教えてください。 例)SHEET1 A1 空白 A2 買い物 A3 金額 A4 残金 入力ボタンをクリックしたらSheet2へ 例)SHEET2 A  B   C   D 12 買い物 金額 残金 と自動で番号が記載され、上の行からどんどん入力記載されるように作りたいのですが、マクロで作れますか?教えてください。 マクロの記述も詳しく教えてください。

  • Excelのマクロでセル単位でロックをかける方法に関する質問です。

    Excelのマクロでセル単位でロックをかける方法に関する質問です。 例えばa1からd10の範囲のセルに対して a列の各セルは、IF関数で数値か""を返しているとします。 a列のセルが数値であれば、同じ行の各セルをロックし、""であれば、後からそのセルに手入力できるようにロックを外したいと思います。(もちろんIF関数は書き換えられますが、それでOKです) 例えば、a1が数値なら、a1,b1,c1,d1の各セルはロックに、     a1が""なら、a1,b1,c1,d1の各セルはアンロックに したいわけです。 手作業だと行数が多い場合大変なので、マクロで自動的に行いたいと思いますが、マクロ初心者のため、どうすればよいのかわかりません。 どなたかご教授願えればありがたいです。 よろしくお願いします。

  • 別ファイルを参照した式入力

    Excel2002を使用しております。 例えば以下の項目を表で作成しているとします。 ------------------------------     A        B     C     D 1 電話番号   住 所   年 齢   名 前 2  0000     *****    25    田中一郎   ------------------------------ 列Dの名前で保存されたファイルに「電話番号」「住所」「年齢」それぞれのデータが入っています。 A~C列に…例)A列:【='D:\例\[田中一郎.xls]Sheet1'!$A$1】と、ファイルを参照させた式を入力したいのですが…。 ファイルの数が100以上あるため、一つ一つ入力するには気の遠くなる作業になってしまいます。 これを【='D:\例\[D1.xls]Sheet1'!$A$1 】のようにD列に入力されたデータを使用してファイル名を参照し、一気に下にコピーさせる事はできますか? 説明が解り辛ければ申し訳ありません。 マクロについてはちんぷんかんぷんなので、もしもマクロを使用しなければいけない場合はお手数ですが詳しく書いて頂けると幸いです。 宜しくお願い申し上げます。

  • Excel2003でcsvの指定行を読み込む

    こんにちわ。 Excel2003のマクロでcsvファイルを読み込みたいと思っています。 csvの中身は下記通りです。 例)   A   B   C   D.......... 1  "氏名" 2  2    2   1   3....(整数の羅列) 3  1    3   2   3....(整数の羅列) 4  3    3   3   3....(整数の羅列) 5  2   1   2   3....(整数の羅列) このファイルを、エクセル上でボタンを押したら(マクロを実行したら)指定した行のみを読み込んで、それをエクセルのシートの指定したセルに代入するのは可能でしょうか?それぞれの行の整数の数は違います。

専門家に質問してみよう