• ベストアンサー

マクロ 行挿入で数式も反映する方法

マクロのフォームを使ってデータ入力・行の挿入を登録したのですが、 シートに入力した計算式が反映されません。 insertRow = Range("登録品目データ").Rows.Count Range("登録品目データ").Rows(insertRow).Insert Shift:=xlDown Range("登録品目データ").Cells(insertRow, 1) = ModelNameBox.Text Range("登録品目データ").Cells(insertRow, 2) = PartNumberBox.Text Range("登録品目データ").Cells(insertRow, 3) = PartNameBox.Text Range("登録品目データ").Cells(insertRow, 4) = StockingPriceBox.Text Range("登録品目データ").Cells(insertRow, 5) = PackingAmountBox.Text Sheets("品目一覧").Protect Unload AddCommodityDlg End Sub 上記Box5に入力したデータを元に、VLOOKUP関数で別のシートの情報を 反映させる式を入力しているのですが、フォームを使って情報入力し、 最下行に挿入すると計算式が反映されません。 どうすればいいか教えて下さい。 宜しくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 >色々説明不足で申し訳ありません。 いいえ、もう、私は、その状況は把握しているつもりなのですが、こちらでは、もう一度、考え直してみました。 >また、名前-定義を使用せず、下記に変更しても反映されませんでした。 >=IF(F4="","",VLOOKUP(F4,梱包容器一覧!A3:E17,5,FALSE)) 上記の書き方なら、名前-定義と同じなのです。なぜかというと、名前の定義の中身が、梱包容器一覧!A3:E17 となっていれば、同じ結果なのです。 私が言ったのは、範囲を列全体にするということです。例:「A:E」 しかし、しばらく考えてみましたが、やはり、マクロ側では、名前定義は、使わなくてもよいような気がします。必然性がありません。そして、その式自体は、間違った解は出ないはずなので、名前-定義の範囲を大きく取ればよいと思うのです。 数式とマクロは別物ですから、マクロ側は、Range("登録品目データ") としなくてもよいと思います。 実際、 A列 1 2 3 4 5 6 7 8   ←(B).ここに入れる たぶん、最終行というのは、この(B)になるのだろうと思います。このマクロには挿入がありませんから、範囲に余裕を持っていれば、まず間違いはないと思います。名前の定義の範囲を1000行程度でも範囲を広げたらどうですか。 ただし、データを入れる最後の行を探す方法は、 With Worksheets("登録品目データ") i = .Range("A65536").End(xlUp).Offset(1)  .Cells(i, 1).Value = ModelNameBox.Text  .Cells(i, 2).Value = PartNumberBox.Text  .Cells(i, 3).Value = PartNameBox.Text  .Cells(i, 4).Value = StockingPriceBox.Text  .Cells(i, 5).Value = PackingAmountBox.Text End With としたらどうでしょうか。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#4の補足 マクロとは別問題の話です。 ものすごく基本的なことですが、可能なら、VLOOKUP側で、名前-定義を使わなければよいのでしょうね。例えば、A:E の広域の範囲にしておけば、問題なく、検索値に反映します。

aKari-G
質問者

補足

ご回答ありがとうございます。 色々説明不足で申し訳ありません。 VLOOKUP関数は下記のように入力しています。 =IF(F4="","",VLOOKUP(F4,登録ケース一覧,5,FALSE)) ご指摘の通り、VLOOKUP関数で名前-定義を使用していますが、上記“登録ケース一覧”もデータを増やしていく為、 名前-定義はできれば使用したいのです。 また、名前-定義を使用せず、下記に変更しても反映されませんでした。 =IF(F4="","",VLOOKUP(F4,梱包容器一覧!A3:E17,5,FALSE)) どうすればいのでしょうか。。。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 質問内容では、推測の範囲は超えないですが、「登録品目データ」名前-定義登録をしているのだと思います。今、見てみましたが、想像する以上にややこしく、難しくなってしまっています。私の推測が正しければ、マクロ1年レベルの人では直せないと思います。こういうときは、自己流でせずに、決まりきったパターンを使えばよかったと思います。 >最下行に挿入すると計算式が反映されません。 今試してみましたが、数回繰り返すと、やはり名前-定義登録は、自動的に変更しないのでうまく反映してくれないようです。マクロでは、名前-定義登録とは相性があまりよくありませんが、数式で使っている以上は使わなくてはなりません。名前の再登録する必要があるようです。 VLOOKUP側で、その名前-定義を使っているようですね。 いろいろやってみましたが、今の状態では、最下行と、名前-定義との関係が、不安定な状態です。 マクロで行の挿入は、一体、どこに入れるのでしょうか? もともと、データの最下行だったら、挿入は必要ないです。データの最下行の一つ手前なら、挿入が必要です。 A 1 2 3 4 5 6 7   ←(A).ここに入れるのですか? 8   ←(B).それとも、ここに入れるのですか?(ここは挿入--Insertではありません) それから、 Range("登録品目データ").Cells(insertRow, 1) = ModelNameBox.Text これは少し意味が違ってきます。 (B) に入れる場合 (今の所、(A)案は考えられません) Sub Sample1() '名前-登録の再定義(最初に、正しければ、この行は不要) Application.Names("登録品目データ").RefersToLocal = _      "=" & Range("A1").CurrentRegion.Address insertrow = Range("登録品目データ").Rows.Count With Range("登録品目データ").Rows(insertrow).Offset(1)  .Cells(1, 1).Value = ModelNameBox.Text  .Cells(1, 2).Value = PartNumberBox.Text  .Cells(1, 3).Value = PartNameBox.Text  .Cells(1, 4).Value = StockingPriceBox.Text  .Cells(1, 5).Value = PackingAmountBox.Text End With '名前-登録の再定義 Application.Names("登録品目データ").RefersToLocal = _      "=" & Range("A1:E" & insertrow + 1).Address ''Range("登録品目データ").Select '確認用 End Sub なお、TextBox のプロパティは、Text で取っても、ワークシートに貼り付けるときには、自動的に、相応しい型にキャストされますので、変換は必要ありません。ただし、入力ミスした場合は除きます。

  • keirika
  • ベストアンサー率42% (279/658)
回答No.3

データ型の問題かもしれません。 テキストボックスで入力した値は文字になります。 Val(PackingAmountBox.Text)などで数値に変換してみてはどうでしょう。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

連続ですみません。 複数のセルに数式を反映する場合は 数式セルも含めて該当セル範囲を選択 数式セルで、F2キーを押して編集モードにする Ctrl+Enter、とキー操作して数式を他のセルにコピー といった操作を「マクロの記録」してみてください。

aKari-G
質問者

補足

ご回答ありがとうございます。 (1)Ctrl+Dのマクロ   Selection.FillDown (2)Ctrl+Enterのマクロ  Selection.FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(RC[-1],登録ケース一覧,5,FALSE))" 上記マクロの頭に  Range("登録品目データ").Cells(insertRow, 6) = を付けて実行すると、(1)=TURE (2)=FALSE がセルに表示されました。 頭に付けるマクロがおかしいのでしょうか? 初歩的な質問になり申し訳ないのですが、 マクロ経験1ヶ月の新人の為、お許し下さい。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

単純に、数式セルをコピーすればどうでしょうか。 あるいは 計算式を反映したいセルを選択して Ctrl+D とキー操作すれば、1行上のセルにある計算式がフィルコピーされます。 上記の操作を「マクロの記録」すればどうでしょうか。 参考になるコードが得られると思います。

関連するQ&A

  • フォームの内容をセルの最上行に挿入したいのですが、やり方が分かりません。

    VBAの初心者ですが、ご指導よろしくお願い致します。 ユーザーフォームの内容を最下行に行を挿入し、そこに転記するのは 出来たのですが、最上行に挿入し転記する方法が分かりません。 最下行への挿入はこの様なコードですが、一応動作しております。 Private Sub CommandButton1_Click() Dim insertRow As Long insertRow = Range("コード表").Rows.Count Range("コード表").Rows(insertRow).Insert Shift:=xlDown Range("コード表").Cells(insertRow, 1) = TextBox4 Range("コード表").Cells(insertRow, 2) = ComboBox2 Range("コード表").Cells(insertRow, 3) = ComboBox3 Range("コード表").Cells(insertRow, 5) = ComboBox4 End Sub よろしくお願い致します。

  • マクロ最終行挿入

    下記のような表があって表の最終行に行を挿入したい場合にこのようなマクロを組んでみたのですが、思ったような動きをしてくれません。 アドバイスを頂けたらありがたいです。またこの場合名前の定義などを使う必要はあるのでしょうか。どうかよろしくお願いします。    A    B    C    D   E   F 1 商品一覧 2 品名 売値 原価 利益 3 たい 1000 800 200 4 ひらめ 1200 800 400 5 かれい 1050 1200 -150 6 さわら 300 150 150 ※ ここに行を挿入したい※   Sub 行挿入() '表の最下行に行を挿入 Dim n As Long n = Range("商品一覧").Rows.Count Range("商品一覧").Cells(n, 1).EntireRow.Insert End Sub

  • エクセル

    下記のようなマクロを作成しましたが、実行するとエラーメッセージ(コンパイルエラー SubまたはFunctionが定義されていません)が表示され止ってしまいます。 解決方法を御指導お願い致します。 Private Sub CommandButton2_Click() '得意先登録ダイアログで登録ボタンをクリック時実行 Dim check As Long '重複の有無(=0:重複せず,>0:重複) Dim insertRow As Long '挿入行位置 '入力必須項目のチェック If koudo.Text = "" Then MsgBox MsgBox "得意先コードを入力してください", vbExclamation, "入力エラー" koudo.SetFocus Exit Sub End If If syamei.Text = "" Then MsgBox "得意先名を入力してください", vbExclamation, "入力エラー" syamei.SetFocus Exit Sub End If '重複チェック On Error Resume Next check = 0 check = WorksheetFunction.Match(clnt(koudo.Text), Range("得意先一覧").Columns(2), 0) On Error GoTo 0 If check > 0 Then MsgBox "この得意先コードは、すでに入力されています", vbExclamation, "入力エラー" koudo.SetFocus Exit Sub End If Sheets("得意先マスター").Unprotect With Range("得意先一覧") '最下行に一行挿入する insertRow = .Rows.Count .Rows(insertRow).Insert Shift:=xlDown 'データをセルに入力する .Cells(insertRow, 1) = tourokubi.Text .Cells(insertRow, 2) = koudo.Text .Cells(insertRow, 3) = syamei.Text .Cells(insertRow, 4) = huri.Text End With Sheets("得意先マスター").Protect Unload 得意先登録ダイアログ End Sub

  • テキストボックスから、複数のシートに転記する方法・・・

    初心者でございます。 テキストボックスに入力したデータを、データベースに行を挿入してその行の各セルへ転記する方法として、以下の方法をとっています。 Private Sub 登録Button1_Click() Dim rowscount As Long rowscount = Range("データ範囲").Rows.Count Range("データ範囲").Cells(rowscount, 1).EntireRow.Insert Range("データ範囲").Cells(rowscount, 2) = TextBox1.Text このテキストボックスに入力したデータを別の2つのシートへも転記したいのですが、どのように複数の転記先を指定してよいかわかりません。どうかご教授お願いいたします。(Excel2003を使用しております)

  • マクロで全てのシートで条件を満たすシートに行を挿入するにはどうしたらいいですか

    マクロ初心者です。自分でも作ってみたのですが、なかなか思うようにいかず困っています。 book内のシート3つ目から最後のシートで、条件に一致するシートの特定位置に行を挿入するということがしたいのですが。 条件とは、1列目の最後の行に「合計」と記入されていれば、行を4行挿入し、上の書式をコピーするというものです。 下記に記しているマクロは、シートを指定した場合には動くのですが、これにシートをnとして、FOR...Nextを付け加えてシートを順番に参照させようとしても、うまくいきません。 Sub 行挿入sample3() With Sheets("10007") For i = 7 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i + 1, 1) = "" Then Exit For ElseIf .Cells(i + 1, 1) = "合計" Then Range(Cells(i + 1, 1), Cells(i + 4, 1)).Select Selection.EntireRow.Insert Range(Cells(i, 1), Cells(i, 3)).Select Selection.Copy Range(Cells(i + 1, 1), Cells(i + 4, 3)).PasteSpecial xlPasteFormats End If Next i End With End Sub 知識をお持ちの方、教えていただけるととても助かります。よろしくお願いします。

  • sheet1上のマクロでsheet2に画面を切り替えずに行を挿入させたい

    Excel2002ユーザーです。 sheet1上で実行するマクロで、画面を切り替えることなく、 いわば水面下でsheet2の行1に空行を挿入させ、常に最新のデータ(Sheet1上にあるセルの値)を書き込んでいく、 ということをしたいのです。 古いデータは順次、下に送られる形です。 まずデータの書き込み以前に、挿入ができないのです。 sheet1上のマクロで、 Worksheets("sheet2").Rows("1:1").Select Selection.Insert Shift:=xlDown と書き込みましたがダメでした。 (実行時エラー'1004': RangeクラスのSelectメソッドが失敗しました) Sheets("sheet2").Select Rows("1:1").Select Selection.Insert Shift:=xlDown の場合、行挿入はOKですが、sheet2に画面が切り替わってしまいます。 常にsheet1の画面を表示させたままにしてこのようなことを行いたいのですが、 良きアイデア、アドバイスがありましたら御教授ください。 よろしくお願い致します。

  • 【マクロ】任意の行の下へ行の挿入&選択

    セルA3:DS750の表があります。 1行=1顧客として使用していますが、度々表に行を挿入して顧客を追加しています。 その為、以下のマクロを作ってみたのですが、最後に【挿入した行をActiveにする】事ができません。 ★挿入位置は、都度変わります。 ★一度に行う挿入行数は1行(多くても3行)の為、マクロは1行追加で作成しています。(行数の指定までは力量により出来ませんでした・・) ★1行目にサンプルを(非表示で)置いて、それを任意の行へ挿入させています。 1行目のサンプルを非表示のまま貼り付けると、挿入した行も非表示になってしまったので、一度再表示させてから処理させています。 サンプル行には、条件書式、数式などがところどころ入っています。 処理の最後に【'行を指定して挿入】と同じ行をActiveにする方法が知りたいです。 記録マクロをいじっただけなので見づらいと思いますが、よろしくお願い致します。 -------------------------------- Sub 挿入() '1行目を再表示 Rows("1:1").Select Selection.EntireRow.Hidden = False '1行目をcopy Rows("1:1").Select Selection.Copy '行を指定して挿入 InsertRow = InputBox("何行目の下に挿入しますか?") + 1 Cells(InsertRow, 1).Insert Shift:=xlDown '1行目を非表示 Rows("1:1").Select Selection.EntireRow.Hidden = True '挿入した行をactiveにする ・・・ end Sub -------------------------------- マクロが根本的におかしかったらすみません。。 アプローチ方法が他にある場合にもご指摘いただけると助かります。

  • 行をコピーして挿入する際のコピー時点滅をなくしたい

    マクロを勉強し始めたばかりの超初心者ですが、 質問させてください。 添付資料のように飲食店でのクレジットカード支払いの明細書を作成中です。 表のように、カード使用件数が一日に1件ではなく、実際には件数はバラバラです。 予め入力用の行を用意しておくのはスペースが邪魔で消去したりも面倒なので コマンドボタンを利用し、実際にカードを使用した件数に合わせて行を挿入し、入力してゆくようにしました。(コードはネットでなんとか拾ってきました。) 挿入する行は予め入力規則を入れてある、空白の行(ここでは画像には入ってませんが、2行目)をコピーして挿入するようになってます。 以下のマクロを使ってコピー→挿入は出来るのですが、 コピーする際に出てくる点滅が視覚的に邪魔で気になります。 もし消せるようであれば教えてください。 Private Sub CommandButton1_Click() Rows("2:2").Select Selection.Copy insertRow = InputBox("何行目の下に挿入しますか?") + 1 Cells(insertRow, 1).Insert shift:=xlDown Application.CutCopyMode = False Rows(insertRow).Select End Sub ※Application.CutCopyMode = False で、点滅が消えるとかなんとか。。。。見かけて入れてみたのですが、 点滅は変わらず・・・・そもそも用語をそこまでまだ知らないのが問題なのですが。。。 お手数おかけしますが、分かる方おられましたらご教授の程よろしくお願いいたしますm(__)m

  • EXCEL(VBA)で1行おきに行を選択する方法

    こんにちは。VBAは苦手なので教えてください。 EXCELのsheet1にあるリストに、下記マクロで1行おきに 空白行を挿入しました。 Sub test1() '隔行で空白行を挿入 Dim rw As Long 'セル For rw = Range("A1").End(xlDown).Row To 2 Step -1 Rows(rw).Insert Next End Sub 同じファイルのSheet2の1行目<Rows("1:1")>に、計算式が入力されています。 マクロで挿入した空白行全てを選択し、そこへSheet2の1行目のコピーを 貼り付けたいです。 ぜひ、良い方法を教えてください。

  • データ数が可変の場合の合計式

    データ数が可変の場合の合計式について御指導お願い致します 様式(11行目から時系列で入力) H列に摘要を入力 K列に日毎の売上金額を入力 ← 11行目から時系列で入力し空欄なし L列に入金額を入力 ← 入金時入力の為空欄あり ユーザーフォームで作成した入力フォームで入力し、登録時一行挿入しています '最下行に一行挿入する insertRow = .Rows.Count .Rows(insertRow).Insert Shift:=xlDown 閉め日に下記のように行ないたく御指導お願い致します。 明細の次の行の各列に下記表示をしたい H列 → 合計と表示したい K列 → 明細の合計を表示したい L列 → 入金の合計を表示したい 宜しく御願いいたします。

専門家に質問してみよう