• ベストアンサー

エクセルのマクロでゴールシークの繰り返し

こんにちは。マクロ初心者です。 現在、エクセルのゴールシーク機能を繰り返し使うためにマクロを作っています。 下のプログラムでアクティブセルのゴールシークは行えるようになったのですが、これをアクティブセルが空白になるまで繰り返すことはできますか? できればiを使わないようにしたいのですが‥ ActiveCell.goalseek Goal:=ActiveCell.Offset(0, -1).Value, ChangingCell:=ActiveCell.Offset(0, -3).Range( _ "A1") ちなみに違う人が使っていた Do Until ActiveCell.Previous.Value = "" を使おうと思ったらパソコンが動かなくなってしまいました‥ 基本ができていない為にめちゃくちゃなことをしているのかもしれませんが、どうかアドバイスをお願い致します。

  • rikta
  • お礼率62% (10/16)

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

  • ベストアンサー
  • n_na_tto
  • ベストアンサー率70% (75/107)
回答No.5

シートの構成、 コードの貼り付けの具体的な手順もなしに 原因などわかりません。 エラーの部分は無視します。 ActiveCellは単一のセルを返しますので、 【E2だけを選択】して下方向に連続処理するなら、 下のコード。その部分に対しては答えておきます。 (ま、これも現在のそちらの状況では 動きませんが。) Dim myRng As Range, r As Range With ActiveCell  Set myRng = Range(.Cells(1), .End(xlDown)) End With For Each r In myRng  With r   .GoalSeek _    Goal:=.Offset(0, -1).Value, _    ChangingCell:=.Offset(0, -3)  End With Next

rikta
質問者

お礼

説明が不十分で申し訳ありませんでした。 エラーの部分は時間ができたらもう一度自分で考えてみようと思います。 今回はなんとかDo Until文で解決できました。 お手数をおかけしてすみませんでした。 何度もご回答いただきありがとうございました。

その他の回答 (4)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

ANo.2です。 >Debug.Print r.Value >の文がうまくコンパイルされません。 提示したコードは参考程度のもので、直接の回答ではありません。 Debug.Print r.Value はイミディエイトウィンドウに結果を表示して確認するだけですので、コンパイルエラー? って言うのも・・・?

rikta
質問者

お礼

そうですか‥ 何も知らないでそのままやろうとしたのでめちゃくちゃになってしまったみたいですね。 お手数おかけしてすみませんでした。 Do Until文で何とか動かすことができましたので、もう大丈夫です。 ありがとうございました!

  • n_na_tto
  • ベストアンサー率70% (75/107)
回答No.3

No.1です。追加します。 下の表のE2:E5を選択しておいて、 その範囲だけゴールシークを 適用するなら、ActiveCellではなく Selectionを使ってください。 __A_____B__C____D_____E_ 1_____変化___目標値___数式_ 2_x1_1.618343_y1____1_1.000692_ 3_x2_2.000009_y2____2_2.000027_ 4_x3_2.302777_y3____3_3.000003_ 5_x4_2.561646_y4____4_4.000383_ Dim r As Range For Each r In Selection With r .GoalSeek _ Goal:=.Offset(0, -1).Value, _ ChangingCell:=.Offset(0, -3) End With Next

rikta
質問者

補足

大変失礼致しました。 誤ってn-junさんのところへ補足を書いてしまいました‥ このようなおっちょこちょいなので初歩的なミスをしているのでしょうが、何かご意見があれば宜しくお願い致します。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

例えばセルA1からA列の最終行までの値を出したいのであれば、 Sub try() Dim r As Range For Each r In Range("A1", Cells(Rows.Count, 1).End(xlUp)) Debug.Print r.Value Next End Sub こんな感じでも出来ますけど。 (アクティブなセルでなければいけないのなら、ちょっと違うかな。)

rikta
質問者

お礼

失礼致しました。 n_na_ttoさんへのお礼と場所が入れ違ってしまいました‥ ご回答ありがとうございます。 n-junさんにお答えいただいたことも、私のやりたいことと合ってはいると思うのですが、こちらもエラーが出てきてしまいました。 Debug.Print r.Value の文がうまくコンパイルされません。 よろしければ、ご意見いただけますでしょうか。

rikta
質問者

補足

詳しくお答えいただき、ありがとうございます。 そして質問の仕方がわかりにくくてすみません。 n_na_ttoさんのデータ例で言えば、E2をアクティブセルにして Eが空白になるまで繰り返したいということだったのですが‥ なので、No.1でお答えいただいたことで私のやりたいことには 合っているのですが、どちらのNo.1、No.3どちらも「SubまたはFunctionが定義されていません」とエラーが出てきてしまいました。 お時間があれば、どこが間違っているのか教えていただけますか。

  • n_na_tto
  • ベストアンサー率70% (75/107)
回答No.1

"アクティブセルが空白になる" の意味がつかめないのですが、 例えば下のようにE列に数式が入っているとして、 "E列を上から順に空白になるまで処理する" なら... __A_____B__C____D_____E_ 1_____変化___目標値___数式_ 2_x1_1.618343_y1____1_1.000692_ 3_x2_2.000009_y2____2_2.000027_ 4_x3_2.302777_y3____3_3.000003_ 5_x4_2.561646_y4____4_4.000383_ Dim myRng As Range, r As Range 'E列の数式が入っている範囲に限定 Set myRng = ActiveSheet.Range("E:E") _   .SpecialCells(xlCellTypeFormulas) For Each r In myRng '上の範囲だけループ  With r   .GoalSeek _    Goal:=.Offset(0, -1).Value, _    ChangingCell:=.Offset(0, -3)  End With Next

関連するQ&A

  • ゴールシーク(マクロ)で型が一致しないと表示

    マクロ初心者です。 ゴールシークを調べると Range(”式の入ったセル”).GoalSeek Goal:=Range(”目標の入ったセル”), ChangingCell:=Range(”変化させるセル”) このような解説があったので、実際に Sub 熱伝導グラフ_ボタン17_Click() Worksheets(Sheet1).Range(S33).GoalSeek Goal:=Worksheets(Sheet1).Range(S32), ChangingCell:=Worksheets(Sheet1).Range(S25) End Sub 上を作成しマクロを実行したのですが、型が一致しませんというエラーが出ます。 何が原因なのか、またどのような対処が必要か教えてください。 作成したいゴールシークはS33の式中のS25を変化させることにより目標値S32になるS25を見つけるプログラムを作成したいと考えています。 よろしくお願いします。

  • マクロよ動け

    VBA 難民です。 Excel で、左のセルが空白の場合、印刷文字を見えなくするつもりのマクロを作ってみましたが、知らん顔をされます。声の掛け方がまだよくわかってないのです。 こっちを向かせる方法を教えて下さい。よろしくお願いします。 Sub MacroWhiter() Dim a As Variant Dim b As Variant a = ActiveCell.Value b = ActiveCell.Offset(0, -1).Value '一つ左のセルの値 Range("B1").Activate 'ここから始める Do Until IsEmpty(ActiveCell.Value) '空きセルまで続ける If b = 0 Then 'ゼロの場合 ActiveCell.Font.Color = 2 '文字を白色にする ActiveCell.Offset(1, 0).Activate '下の行に移る End If Exit Do Loop '繰り返す a = ActiveCell.Value

  • エクセルマクロが重い

    こんにちは。 ご教授くださいませ。 すでに先方が作っているエクセルのシートがありまして、 そのシートの表組み規則にのっとって入力するユーザーフォーム を私のほうで作ったのですが、重いです。 selectの多用はだめ!というところまでは調べたのですが じゃあどうしたらいいかわかりません。 ■ '--------------------8時から If OptionButton1.Value = True Then ActiveCell.Offset(3, -1).Range("A1").Select ActiveCell = UserForm3.TextBox1.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox2.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox3.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox4.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox5.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox6.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox12.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox11.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox10.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox9.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox8.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox7.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox13.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox14.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox15.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox16.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox17.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox18.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox24.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox23.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox22.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox21.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox20.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox19.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox25.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox26.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox27.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox28.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox29.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox30.Value 'ActiveWorkbook.Save MsgBox "入力しました。", vbInformation, "確認" End If '--------------------8時から(END ■ 基本の流れは... 最初にオプションボタン3つのどれか1個の 選択を求め、その条件に応じて 始基点となるセルが変わります。 で、あとは与えられた表組みを縦や横に 移動しながら、対応するテキストボックスの 値を入れる、という 我ながら頭の悪い方法で^^; .selectではない、スマートな方法があればと思います。 ぜひお知恵を!

  • エクセルマクロで条件で印刷がしたいのですが理解不能

    エクセルのマクロで条件付きで印刷がしたいのですが、解りません… クイック印刷ボタンを押すとセルの文字列の変化(「合」&「不」の2種類)によって印刷フォームを変えたいのです。 2列目の結果を判断しA3から空白セルまで連続印刷2種類とも、一度で無理ならボタン2個準備 可 sheet4---"合" フォーム   sheet5---"不" フォーム sheet3に一覧表があります。 "合"マクロの作成したのですが、"不"をどのように入れればいいか解りません。     1 2 3 4 5 6 7 8 9 10 ..... 13 14 15 16 A2  製番 合否 種類 型式 開始 終了 工1 工2 外観 気密.....初MIN 初MAX 終MIN 終MAX A3 001 合  AA 123 1/7 1/15 良 良  良 良 0.8 0.9 1.2 1.5 A4 002 合  BB 456 1/8 1/16 良 良  良 良 0.8 0.9 1.2 1.5 A5 003 不  CC 789 1/9 1/12 良 否   良 良 0.6 0.8 - - ・ ・ A22 020 合  TT 999 1/7 1/15 良 良  良 良 0.8 0.9 1.2 1.5 Worksheets("sheet3").Activate Range("A3").Select '開始セル製造番号 'ループXの開始 Do 'アクティブセルを1つ下に移動 ActiveCell.Offset(1, 0).Select If oSht.Cells(idx, 3) = "合" Then   ' 繰り返し処理  End If '空欄であれば、プログラムを終了する 'Trim関数は前後のスペースを消去する If Trim(ActiveCell.Value) = "" Then Exit Do End If '非表示セルは印刷の対象としない If ActiveCell.EntireRow.Hidden = False Then 'これ以降、すべて印刷用シート With Worksheets("合") 'レコードの先頭セルを選択 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '製造番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C14").Value = ActiveCell.Offset(0, 4).Value '開始日 .Range("C15").Value = ActiveCell.Offset(0, 5).Value '終了日 .Range("C6").Value = ActiveCell.Offset(0, 6).Value '工程1担当 .Range("C7").Value = ActiveCell.Offset(0, 7).Value '工程2担当 .Range("C9").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C10").Value = ActiveCell.Offset(0, 10).Value '気密 .Range("C11").Value = ActiveCell.Offset(0, 13).Value '初期MIN .Range("C12").Value = ActiveCell.Offset(0, 14).Value '初期MAX .Range("C13").Value = ActiveCell.Offset(0, 15).Value '終期MIN .Range("C14").Value = ActiveCell.Offset(0, 16).Value '終期MAX 'レコードの最終セルであれば、1部印刷を実行する .PrintOut '印刷用シート終了 End With

  • マクロでテーターを転記した時の空白なしに

    いつもお世話になります。 WINDOWS7 EXCEL2010 です。 添付図で説明させていただきますと、 右側の「請求書」のL5:O9 のデーターを左の「売上表」に下記のマクロにて転記します。 元の値(請求書 L5:O9)の範囲内のデーターが1行 2行 3行 4行は空白行が又は5行の場合はすべてが埋まったりします。 この場合5行の時はいいのですが、例えばデーターが3行の時は添付図で言いますと5の行6の行のように2行が空白になります。 下記のマクロの構文をどういう具合にすればいいか御指導願えませんでしょうか。 参考に、 L5 =IF(B15="","",B15) M5 =IF(L5="","",$A$2) N5 =IF(L5="","",C15) O5 =IF(L5="","",H15) ※ 下記のようにしたかったのですがマクロに詳しくないのと時間がないので上記のような方法になり少し遠回りです。 ‘Range("B1").Select ‘ActiveCell.Offset(1, 0).Activate マクロです。 Sub 売上表へ転記() Dim ID As Long Dim 納品日 As Date ID = Range("M5").Value 日付 = Range("L5").Value Range("L5:O9").Copy Sheets("売上表").Activate Range("A65536").End(xlUp).Activate '販売記録A2がアクティブセル(タイトル行) ActiveCell.Offset(1, 0).Activate ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False 'A2:E2 ActiveCell.Offset(0, 4).Activate 'C2が空白 Do Until ActiveCell.Offset(2, 0).Value = "" ActiveCell.Value = ID 'G2 ActiveCell.Offset(0, 0).Value = 納品日 'A3 ActiveCell.Offset(1, 0).Activate Loop End Sub

  • エクセルマクロ-条件付き繰り返し

    マクロ初心者です。(エクセル2003使用) シート1にある表で、M列が空白以外(処理済みなどの値がある場合)である場合、その行全体をコピーし、シート2の最終行に貼り付けして、シート1からはその行を削除するマクロを作成したいと思っていますができません。 すみませんが、どなたかご教授願います。 (シート1の表) ・8行目が題目となっており、A9から表となっています。 ・表の全体サイズは、横がAからMまでで、縦はC(シー)の管理番号行分までとなっています。(Mは、空欄があったり値(処理済みなどの値)が入っていたりしています) (考えているマクロ) ・Loopの回数は、Cの管理番号が終わるまで ・IFでCに値があり、Mが空欄だった場合は、そのまま(何もしない) ・Cに値があり、Mに値があった場合は、その行全体を選択しコピーし、シート3の最終行に貼り付け、シート1のその行は削除する Sub 処理済み() Range("C9").Select Do While ActiveCell.Value = "" ActiveCell.Offset(1).Select Loop If ActiveCell.Offset(, 10).Value = "" Then そのまま Else If ActiveCell.Offset(, 10).Value = "値があったら" Then その行全体を Select.Copy Sheets("Sheet2").Select Dim 下 下 = Range("A").End(xlDown).Row ペースト 削除 End If End Sub すみませんが、どなたか教えていただけましたら助かります。 よろしくお願いいたします。

  • Do loopのマクロ

    以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

  • マクロでテーターを転記した時の空白なしに

    いつもお世話になります。 WINDOWS7 EXCEL2010 です。 添付図で説明させていただきますと、 右側の「請求書」のL5:O9 のデーターを左の「売上表」に下記のマクロにて転記します。 元の値(請求書 L5:O9)の範囲内のデーターが1行 2行 3行 4行は空白行が又は5行の場合はすべてが埋まったりします。 この場合5行の時はいいのですが、例えばデーターが3行の時は添付図で言いますと5の行6の行のように2行が空白になります。 下記のマクロの構文をどういう具合にすればいいか御指導願えませんでしょうか。 参考に、 L5 =IF(B15="","",B15) M5 =IF(L5="","",$A$2) N5 =IF(L5="","",C15) O5 =IF(L5="","",H15) ※ 下記のようにしたかったのですがそれ程詳しくないのと時間がないので上記のような方法になり少し遠回りです。 ‘Range("B1").Select ‘ActiveCell.Offset(1, 0).Activate マクロです。 Sub 売上表へ転記() Dim ID As Long Dim 納品日 As Date ID = Range("M5").Value 日付 = Range("L5").Value Range("L5:O9").Copy Sheets("売上表").Activate Range("A65536").End(xlUp).Activate '販売記録A2がアクティブセル(タイトル行) ActiveCell.Offset(1, 0).Activate ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False 'A2:E2 ActiveCell.Offset(0, 4).Activate 'C2が空白 Do Until ActiveCell.Offset(2, 0).Value = "" ActiveCell.Value = ID 'G2 ActiveCell.Offset(0, 0).Value = 納品日 'A3 ActiveCell.Offset(1, 0).Activate Loop End Sub

  • Excelマクロ:変数でセル範囲指定

    マクロの迷い人です。 Excelの表をマクロで印刷しようと思っています。 行の数が毎回違うため、最終セルもその都度指定しなければなりません。 A1 B1 A2 B2 A3 B3 A4 B4 この例で、A5 B5 以降は空セルとします。 印刷範囲を Range("A1:B4")と書かずに、そのときどきのアクティブセルを変数に代入し、変数を使って範囲指定したいのです。 Sub MacroTest () Dim a As Variant Dim b As Variant Range("B1").Activate Do While a <> 0 ActiveCell.Offset(1, 0).Activate '空白でなければ一つ下に移る a = ActiveCell.Value Loop ActiveCell.Offset(-1, 0).Activate '上の行に移る b = ActiveCell.Value Range("A1:"& b).Select End Sub こうしてみましたがダメでした。 デバッグの方法がわからないので教えて下さい。よろしくお願いします。

  • 連続印刷処理前に確認しOKしてから再開するマクロ

    連続印刷マクロを作成したのですが、印刷の手前で確認を入れたいので、その処理を教えてください。 エクセルの表は項目が14列あり、999行です。 印刷は、2種類のシートに分け印刷できるようになっているのですが、確認は1度だけを考えています。 Sub 印刷_Click() Worksheets("集計・印刷").Activate '作業シート名 Range("A2").Select '番号(001~999)をこの次の"A3"セルより転記される。 Do '↓ ※1度の作業で15個の番号を最大とします。 'アクティブセルを1つ下に移動 ActiveCell.Offset(1, 0).Select '1度の作業で15枚印刷する。 '空欄であれば、プログラムを終了する 'Trim関数は前後のスペースを消去する If Trim(ActiveCell.Value) = "" Then Exit Do End If '非表示セルは印刷の対象としない If ActiveCell.EntireRow.Hidden = False Then If ActiveCell.Offset(, 2).Value = "単品" Then 'C列で単品の判断をする。 With Worksheets("A") 'Aシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 '繰返し処理をしているので一度に印刷される。 .PrintOut End With ElseIf ActiveCell.Offset(, 2).Value = "複数品" Then'C列で複数品の判断をする。 With Worksheets("B") 'Bシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 .Range("C11").Value = ActiveCell.Offset(0, 23).Value '(1)min .Range("C12").Value = ActiveCell.Offset(0, 24).Value '(1)max .Range("F7").Value = ActiveCell.Offset(0, 25).Value '(2)min .Range("F8").Value = ActiveCell.Offset(0, 26).Value '(2)max '繰返し処理をしているので一度に印刷される。 .PrintOut End With End If End If Loop End Sub

専門家に質問してみよう