- ベストアンサー
マクロで発生するエラーを無視するには
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim CellRange As String, S As String CellRange = "A1:D5" ActSheet = ActiveWorkbook.ActiveSheet.Name '現在開いているシート名を取得 ActSheet = Left(ActSheet, 5) 'シート名から「Sheet」の部分だけ抜き出す Set r = Intersect(Target, Range(CellRange)) If Not (r Is Nothing) Then Application.EnableEvents = False For Num = 1 To 3 S = ActSheet & Num Worksheets(S).Range(r.Address).Value = r.Value Next Application.EnableEvents = True End If End Sub シートSheet1、Sheet2、Sheet3がある時に、 あるシートのセル範囲A1:D5の中のセルに値が書き込まれたら、他のシートの同じ位置に同じ値を入力させるコードです。 このコードは過去に質問した時に教えていただいたもののほぼコピーです。 値を入力し、確定後にシートを切り替えることで正常に動作します。 ただし、セルに値を入力したが『確定していない状態』でシートを切り替えるとエラーが発生して止まります。 エラーメッセージは「実行時エラー'1004' Intersectメソッドは失敗しました。'_Global'オブジェクト」と出ます。 確定せずにシートを切り替えたのだからエラーが出るのは当たり前だと思うのですが、 なんとかエラーが出ないようにする方法は無いでしょうか。 欲を言えば、 シートを切り替えた時点でセルに入った未確定の値は確定扱いになって、 『他のシートの同じ位置に同じ値を入れる』のマクロが正常に動作するのが最も望ましいですが、 不可能な気もするので、 未確定の状態でシートを切り替えた場合は『他のシートの同じ位置に同じ値を入れる』のマクロは実行されなくても良いです。 ただエラーメッセージが出て止まってしまうのを避けたいです。 「エラーが出た時にエラーメッセージの「終了」を押す」というマクロが組めればそれでも問題ないのですが、 流石にその操作は「マクロを記録する」では記録してくれませんでした。
- rem_1982
- お礼率83% (142/170)
- オフィス系ソフト
- 回答数6
- ありがとう数6
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >このコードは過去に質問した時に教えていただいたもののほぼコピーです。 ということはそれからあまり進歩してないと言うことですね??? なとど詰まらぬ突込みは置いといて、、(^^;;; >Set r = Intersect(Target, Range(CellRange)) これの、Range(CellRange)の前に、Sh. を付けて Set r = Intersect(Target, Sh.Range(CellRange)) とすればOKです。 ------- Sh とは。--------- Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) この引数の、Sh as Object の Sh が入力したセルのシート、つまり Sheet1 のことです。 -------------------------- が、なぜエラーになるかの原因が分からないまま、ただ上手くいくコードだけでは意味がないと思われますので。 (エラーの原因) Sheet1 がアクティブのとき該当セルに値を入力して確定しないまま Sheet2 をアクティブにした場合を想定 >Set r = Intersect(Target, Range(CellRange)) これでは、Targetのシートは値を入れたシートである、Sheet1 で Range(CellRange)のシートは、値を入れた後アクティブにしたシートである Sheet2 となり、 ●●異なるシートのセルを比べているのでエラーになるのです● 今回のようにRangeオブジェクトの前にSheetオブジェクトを省いたときは そのRangeオブジェクトがどのSheetのものかちゃんと理解しておかなければいけません。 但し、ActiveSheetだけを扱うときはこの限りではありませんが。 それから、これを修正しても質問者が提示したコードにはちょと感心しないところもありますが、 今回はあまり問題とならないのでそれはまた次の機会に。 以上です。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。#4です。 >今回のエラーは回避できるらしいことがわかったので、エラーの無視ではなく回避する方向で進めようと思っています。 それは、#5のことを言っていますね。そのほうが、コンセプトはそのままで、変更も少しですみますからね。 私も、それは分かっていましたが、あくまでも、こちらは、ご質問の元の意に従ったということと、誤った処理方法は、あくまでもエラー処理として扱うことにしました。入力状態のまま、他のシートを参照した場合に、そこでエラー処理をするという最初のご質問のコンセプトは、私は間違いがないと思います。 最初のご質問: >確定せずにシートを切り替えたのだからエラーが出るのは当たり前だと思うのですが、 >なんとかエラーが出ないようにする方法は無いでしょうか。 別に、趣旨を変えることはかまいませんし、こちらのは、かなり変わった特殊なテクニックのコードですから、その立場を主張するつもりはありません(^^;。一見、初級のようで、一旦、Select したセルを外して、ActiveCell にすることで、串刺しを成功させています。 それと、なぜ、入力中に他のシートを参照しようとしたのか、その原因を考えて、FormulaLocal にしています。 また、ループして値を入れていくのは、Range「アドレス」を文字化して、シートそれぞれに、Rangeの引数にアドレスを入れて代入することなのですが、それは、私のVBAのコードのスタイルには合わないので別の方法を使っています。なんとなく、座りが悪いからです。 >実際に使いたいコードではBook内の一部のシートなので、 それは、Index で行うか、 For Each sht In Worksheets Worksheets の代わりに、 For Each sht In Worksheets(Array("Sheet1", "Sheet2", "Sheet3")) のようにすればよいです。 >「On Error GoTo 0」を入れてエラー処理を元に戻すようにする、という意味ですよね? エラートラップを設けた部分は、最後に、エラートラップを外します。エラートラップで、セルのオブジェクトが取れているか取れていないかだけの判定をします。通常は、Err.Number を取りますが、'1004'というのでは、ワークシートの実行時エラーなので、それでは、曖昧すぎますので、セルのオブジェクトの取得を判定にしました。
お礼
>入力状態のまま、他のシートを参照した場合に、そこでエラー処理をするという最初のご質問のコンセプトは、私は間違いがないと思います。 私としては、今回エラー処理の仕方を聞いたのは苦肉の策でした(苦笑)。 エラーは回避したいが、入力状態で他シート参照だからエラー発生は当然(あくまで自分の認識)。 では無視するしかない、と。 これがコードの組み方で回避できるのであれば、 「エラーが出たら無視してもらう」といった回避法よりはカッコイイと考えます(これも自分の印象です)。 聞いたまんまを実行して「回避できました」と言うのも図々しいですが…。 ただ、今回こんなレベルのスキルで作ろうとしているものは、ヒトに使わせたいものなので、 製作段階でこちらが意図できないエラーは無視してもらう、という意図ではエラー処理を入れておこうと思います。 >For Each sht In Worksheets(Array("Sheet1", "Sheet2", "Sheet3")) シートの数は可変なのでこのままでは使えませんが、 検索したところ、 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard28.htm このあたりを組み合わせればできそうだと思っています(まだ組めてません)。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >確定せずにシートを切り替えたのだからエラーが出るのは当たり前だと思うのですが、 >なんとかエラーが出ないようにする方法は無いでしょうか。 エラーは、Err.Number で取るよりも、実際のオブジェクトを確保していないことで、エラーを判定すればよいです。ただ、エラー処理の仕方は、かなり難しいです。エラーの発生の原因をよくつかんでから行うべきだと思います。そうしないと、おかしなことになります。また、On Error Resume Next なら、それを一旦、エラー・トラップは、終わらせるべきだと思います。 なお、シートをループするなら、 For Num = 1 To 3 は、単に、Index ですればよいですね。ただし、私の以下のマクロの場合は、シートの選択する順序があります。 以下は、串刺しで、行う特殊な方法です。 '---------------------------------- 'ThisWorkbook モジュール '---------------------------------- Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Const CellRange As String = "A1:D5" Dim sht As Worksheet Dim r As Range On Error Resume Next If Target.Count > 1 Then Exit Sub Set r = Intersect(Target, Range(CellRange)) On Error GoTo 0 If r Is Nothing Then Exit Sub Application.ScreenUpdating = False Application.EnableEvents = False Sh.Select False For Each sht In Worksheets If Not Sh Is sht Then sht.Select False 'シート選択 End If Next r.Select ActiveCell.FormulaLocal = r.FormulaLocal '串刺し Sh.Select r.Offset(1).Select Application.EnableEvents = True Application.ScreenUpdating = True End Sub
お礼
回答ありがとうございます。 返信が遅れて申し訳ありません。 サンプルコードまで挙げてもらっておいて非常に申し訳ないのですが、 今回のエラーは回避できるらしいことがわかったので、エラーの無視ではなく回避する方向で進めようと思っています。 >また、On Error Resume Next なら、それを一旦、エラー・トラップは、終わらせるべきだと思います。 「On Error GoTo 0」を入れてエラー処理を元に戻すようにする、という意味ですよね? 参考にします。 >ループは~~単に、Index ですればよいですね 「For Each」で検索したところ、 コレクション専用のループ方式、という説明が見つかりましたが、これのことですよね? 定時したサンプルでは同期させたいシートはBook内全てでしたが、 実際に使いたいコードではBook内の一部のシートなので、巧く使えるかわかりません。 ループ内部に「目的のシートじゃなければ行わない」といったif文を入れてみる、くらいしか思いつかないです。
- x0000x
- ベストアンサー率52% (67/127)
#2です。 質問内容を良く読まないで回等しました。 >欲を言えば、 >シートを切り替えた時点でセルに入った未確定の値は確定扱いになって、 >『他のシートの同じ位置に同じ値を入れる』のマクロが正常に動作するのが最も望ましい 以下の2行を変更してみてください。 'Set r = Intersect(Target, Range(CellRange)) '旧 Set r = Intersect(Range(Target.Address), Range(CellRange)) '新 'Worksheets(S).Range(r.Address).Value = r.Value '旧 Worksheets(S).Range(r.Address).Value = Target.Value '新 入力途中でも、同様な動作が可能となります。
お礼
回答ありがとうございます。 返信が遅れて申し訳ありません。 サンプルにおいては満足のいく結果となりました。 コードの細かい意味まではまだ理解できてませんが・・・。 実際にこのコードを、自分の目的のコードに組み込んでみたのですが、 こちらでは条件が異なるためちょっと不具合があったので、もう少し考えて見ます。
- x0000x
- ベストアンサー率52% (67/127)
こんばんは。 エラーを表示しないで、処理をスキップするなら 以下の様に「On Error Resume Next」を追加します。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) On Error Resume Next エラー時は、次行から処理します。 次行の If Not (r Is Nothing) Then により、条件が成立しないため、何も処理されません。
お礼
回答ありがとうございます。 無事(?)、エラーを無視してくれました。 今回はエラー回避の方向でも沢山回答をいただけたので、回避を考えてみることにします。 しかしこの「エラーを無視する」って記述を知ってしまうと、 とりあえずモノだけ完成させたい、って時に乱用してしまいそうです(苦笑)。
以下をマクロの先頭へ追加してみては? On Error Resume Next #ほんとはきちんとエラー処理したほうがよいです。 もしやりたいならマクロ勉強しましょう。
お礼
回答ありがとうございます。 挙げていただいた一行を組み込んだところ、思ったように動作しました。 しかし多くの方から回答をもらえたので、 今回のエラーについては無視ではなくエラー回避の方向で考えてみたいと思います。 言い訳ですけど、 私が「エラー発生を無視する記述」を求めたのは、 今回の件では「未確定なんだからエラー発生は当然。ゆえに回避不可」かな、と思っていたので。 しっかり原因があって(それこそ当然な気もしますが)、回避できるんですねー。
関連するQ&A
- イベントマクロで「コンパイルエラー 因数は省略できません」
マクロ初心者です イベントマクロを作りました Sheet2の結合されたB44:E44のセルに入力すると自動的にマクロが働いて Sheet1のW1の値のみがSheet2の結合されたB44:E44のセルに貼り付けられるマクロなのですが 実行すると「コンパイルエラー 因数は省略できません」と表示されます マクロ自体は正しく動いているのですがどういうことなんでしょう Sheet2 Worksheet Change Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub Application.EnableEvents = False Sheets(1).Select Range("W1").Copy Sheets(2).Select Range("B44:E44").Select ActiveSheet.Paste Application.CutCopyMode = False Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range)…この行が黄色になります If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub…intersectのところが青くなります こんな説明でわかってもらえるでしょうか?
- ベストアンサー
- オフィス系ソフト
- ThisWorkBookモジュールとSheetモジュールの両立
エクセル2003でマクロを組んでいます。 Sheet1,Sheet2の2つのシートがあり、 片方のシートの"A4:G10"の範囲に値を書き込むと、もう片方の同じ位置に同じ値が書き込まれるようなマクロを組みたいです。 以前ここで教えていただいたものを改変して以下を作りました(ThisWorkBookモジュールです)。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range Dim Num As Integer Dim S As String, Sh_name As String Sh_name = ActiveSheet.Name Set r = Intersect(Target, Range("A4:G10")) If Not (r Is Nothing) Then Application.EnableEvents = False For Num = 1 To 2 S = "Sheet" & Num If S <> Sh_name Then Worksheets(S).Range(r.Address).Value = r.Value End If Next Application.EnableEvents = True End If End Sub ここまでは正常に動作します。 また、 Sheet1とSheet2のモジュールに、 A列のセルに値が入力された場合、同じ行のC列のセルの色を塗るという記述をしています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Cells(Target.Row, 3).Interior.ColorIndex = 5 End If End Sub これらを同時に生かしたいのですが、 どのように書けばいいでしょうか。 EnableEvents = False/Trueを消してしまうと、 Worksheets(S).Range(r.Address).Value = r.Valueが実行されるたびにThisWorkBookモジュールが動いているようです。 そして2回目のSet r = Intersect(Target, Range("A4:G10"))でエラーが出ます。 (エラーは出ずとも延々と(無限ではない回数)ThisWorkBookモジュールを繰り返したコードもありました。) よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルのマクロについて
以前、こちらのマクロで Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("a1")) Is Nothing Then Exit Sub Application.EnableEvents = False Range("a3:ba28").Replace What:="=*!", Replacement:=Target.Value, LookAt:=xlPart Application.EnableEvents = True End Sub 指定した範囲を(A1)セルに入力した値に置換するマクロを教えていただいたんですが、現在,、これを使ってsheet1の指定範囲内にある(=あ!$AR$75)などが入力してある部分のシート名を置換してデータ内容の変更を行っています。 しかし、この方法だと、シート名の文字数を指定しなくてはならなくて、自分以外の人が操作すると、エラーを出してしまうことがあり困っています。そこでchangeイベントをやめて、シート名の確認をしてからマクロの実行を行うには、どういったマクロにすればいいですか?? 説明が分かりづらくすみません・・・・・・。 もし他にシートの文字数などにこだわらなくてもよい方法があれば教えてください。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセル・マクロについて
以下のマクロはセルA1~A100にて1が表示されると音(Beep)が鳴るというものです。これを下記(1)(2)ができるように修正したいです。ご教示お願いします。 (1)音(Beep)と同時にセルA1~A100のどのセルにて1が表示されたかわかるようにしたいです。メッセージボックスなどにて表示させるにはどのように修正すれば良いですか? 例.A12で1が表示されたら音が鳴りメッセージボックスにA12と表示される。続いてA55で1が表示されたら音が鳴りメッセージボックスにA55と表示される、みたいに・・・。 (2)音がBeepですが、これ以外に音を変更させることは可能ですか? 音は何でもいいです。(ピーとかポロンなど) ※このマクロはシート右クリック→コードの表示で開いた所に打ち込んでいます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Variant Dim r As Range Dim c As Variant On Error GoTo EndLine i = Null Set r = Target.DirectDependents For Each c In Range("A1:A100").Cells If Not Intersect(r, c) Is Nothing Then i = c.Value Exit For End If Next c Application.EnableEvents = False If i = 1 Then Beep End If Set r = Nothing EndLine: Application.EnableEvents = True
- ベストアンサー
- オフィス系ソフト
- セルの同期を取る
Book内のシートの一部のセルにおいて、同期を取りたいです。 存在するシート名が、SheetA1,SheetA2,SheetB1,SheetB2,SheetC1,SheetC2の時、 SheetA1とSheetA2、SheetB1とSheetB2、SheetC1とSheetC2が、任意のセル範囲の値を共有したいです。 (SheetA1のセルA1に数字を入れたら、SheetA2のセルA1に同じ数字が入るように) 過去ログから以下のソースを見つけて「ThisWorkbook」に書き込んで使っていますが、 たまにエラーが起こって止まってしまいます。 必ず起こるわけではないのでエラーが起こる条件がいまいちわからないのですが、 起こる瞬間は、セルに数値を入力後、シートを切り替えた時に発生します。 (エラーが起こった時に数値を入力したセルは、同期を取っているセル範囲とは限りません) エラーメッセージは、 実行時エラー'1004': 'Intersect'メソッドは失敗しました:'_Global'オブジェクト です。 「ヘルプ」も見てみようと押してみたのですが、ウィンドウが開くだけで中身は表示されませんでした。 「デバッグ」を実行すると、※印をつけた Set r = Intersect(Target, Range(CellRange)) の行が選択されます。 どういった条件でエラーが発生するのかわかりますでしょうか? Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range Dim i As Integer Dim ActSheet As String Dim CellRange As String ActSheet = ActiveWorkbook.ActiveSheet.Name '現在開いているシート名を取得 ActSheet = Left(ActSheet, 6) 'シート名の頭から5文字を取得 If ActSheet = "SheetA" Then '現在開いているシートがSheetA*の時に CellRange = "A4:G3004" '同期を取るセルの範囲を指定 ElseIf ActSheet = "SheetB" Then CellRange = "A3:E3003" ElseIf ActSheet = "SheetC" Then CellRange = "A4:F3004" Else Exit Sub End If Application.EnableEvents = False If Target.Areas.Count = 1 Then '変更のあったセルが1つである場合 ※ Set r = Intersect(Target, Range(CellRange)) If Not (r Is Nothing) Then CopyToSheets r, ActSheet End If Else For i = 1 To Target.Areas.Count '変更のあったセルが複数の場合 Set r = Intersect(Target.Areas(i), Range(CellRange)) If Not (r Is Nothing) Then CopyToSheets r, ActSheet End If Next End If Application.EnableEvents = True End Sub Private Sub CopyToSheets(ByVal r As Range, ByVal ActSheet As String) Dim Num As Integer Dim OffSheet As String For Num = 1 To 2 OffSheet = ActSheet & Num Worksheets(OffSheet).Range(r.Address).Value = r.Value Next End Sub
- 締切済み
- オフィス系ソフト
- エクセルのマクロ
セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub
- ベストアンサー
- Excel(エクセル)
- マクロでシート名を変更を変更したい
A1セルの値をシート名にするマクロは以下のとおりだと思います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub では、E6セルの値をシート名にすることは可能でしょうか? よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
- エクセルチャート操作のマクロのエラー
エクセルマクロ初心者です。グラフの縦軸をセルの値の変化に合わせて変化するよう(対照のセルはB1とB2で変化します。)下記のマクロをネット検索してモジュールに貼り付け機能するようになったのですが、シートに保護をかけると、「実行時エラー ー214767259(80004005): MaximumScaleメソッドは失敗しましたAxisオブジェクト のメッセージが出て機能しません。 Worksheet_SelectionChange(ByVal Target As Range) If Range(A1) <> "" Then Call AxesSet End Sub Sub AxesSet() Dim oChart As ChartObject Set oChart = Worksheets("Sheet1").ChartObjects(1) With oChart.Chart.Axes(xlValue, xlPrimary) .MaximumScale = Worksheets("Sheet1").Range(B1) .MinimumScale = Worksheets("Sheet1").Range(B2) .DisplayUnit = xlThousands .HasDisplayUnitLabel = False .MinorTickMark = xlInside End With End Sub 対照セルの保護の問題かと思い、セルのロックを解除したり、マクロから保護を解除するなど検索してみたのですが上手くいきません。シートを保護してもマクロが機能する解決方法お教えください。
- ベストアンサー
- Excel(エクセル)
- エクセル マクロ 初心者です
エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。
- ベストアンサー
- オフィス系ソフト
- セル範囲に変化があったときに日付けが入るマクロ
お世話になっております。 以前、A1からS19までのセルに変化があったときに日付けが入るマクロについて、 この掲示板で質問させていただいた者ですが、さらに伺いたいことがあります。 そのときは、以下のプログラムを教えていただきました。 private sub Worksheet_Change(byval Target as excel.range) dim h as range on error resume next for each h in application.intersect(target, range("A1:S19")) application.enableevents = false cells(h.row, "T") = date application.enableevents = true next end sub しかし、質問の時点でご指摘のあったことではあったのですが、このプログラムだと 値を変更したとき、セルをダブルクリックして編集可能にしたときだけではなく、 A列からS列に列を挿入したとき、又は列を削除したときも一斉にT列に日付け が入ってしまいます。 列の挿入・削除の場合は、日付けが入らないようにすることは可能でしょうか? 教えていただけると幸いです。よろしくお願いいたします。
- ベストアンサー
- Excel(エクセル)
お礼
回答ありがとうございます。 返信が遅れて申し訳ありません。 >>ほぼコピーです >ということはそれからあまり進歩してないと言うことですね??? おっしゃる通りで返す言葉もありません(苦笑)。 コードを眺めているうちに、なんとなく意味はわかる気がする、といった程度です。 「エラーが出た時にエラーメッセージの「終了」を押す」を本気で「マクロを記録する」で記録しようとしたくらいですから…。 余談ですが、 私としては「挙げてもらったほぼコピーのコードに文句付けるな」という風に言われるのではないか、 という点についてのみ心配でした(笑)。 エラーの原因に関しては、非常に納得できました! 「未確定なんだから当然では?」などと、深く考えてすらいませんでした。 今回のサンプルコードにおいては、Range(CellRange)の前に、Sh.を付けることで望む動作となりました。 ただ、このサンプルコードをもとに作りたい目的のコードにおいては、 若干条件が異なるため気になる点が残ってしまいました。 もう少し考えてみます。 >それから、これを修正しても質問者が提示したコードにはちょと感心しないところもありますが 是非教えて頂きたいです。 一から自分で組んだものでないため、聞いても理解できない可能性が高いですが、 聞いておきたいと思います。