- ベストアンサー
Execlマクロのエラーを直したい
古いバージョンの話なのですが、Office98の頃のExcelで前任者が 作った複雑なマクロがあります。売上データを元にして、ピボット テーブルを作成し、さらにできあがった表からグラフを作成する という一連の流れがボタン一つでできるというマクロです。 前任者から引き継いだときは集計のときはボタンを押せばいいから、 ということしか聞いておらず、それでうまく行っていたのですが、 社内のPCを新しくしてExcelを2002にしたところ、マクロが途中で 止まってしまうようになりました。 現在はOSはXP、Officeは2003ですが、このマクロを動かすときだけは、 社内に1台だけ残っているWindows98のマシンに入っているExcel2000 を立ち上げ、マクロを走らせて対処していますが、いいかげんマクロを 直してExcel2003でも動くようにしたいと思っています。 マクロの内容もわからないままでこういう質問に答えるのは難しい とは思いますが、何か解決策やヒントを教えていただけると助かります。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
これってOffice2000の時は問題なく動いてたのですか? まぁ、とにかく セルのB列の8行目以降に"確定 計"という文字の入ったセルは存在しますか? その"確定 計"セルが無ければ無限ループしますね、でもこれってOffice2000でも同じだと思いますが。。。 回避策は以下の場所に1行追加して下さい。 … I = I + 1 Else End If If ActiveCell.Row >= 65536 Then Exit Do '←これを追加 Loop これでとりあえず処理は終了する事は出来ます。 でももし出来るなら作り直した方が良さそうな気がします。 因みに、マクロ実行中にESCキーを押すとデバッグに入れますよ。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 確かに、Office 97/98 時代の記録マクロに、そういう書き方がありますね。 ActiveCell.Range("A1:P1").Select 記録マクロで、相対参照で取るとこのようになります。 解決しているのかもしれませんが、いくつかポイントがありますね。 >全部で486行あるマクロなのですが、447行目で止まりました。 まず、これは分散し構造化したほうがよいです。プロシージャの塊は、100行程度までです。ただ、分散化するには、多少技術が必要になります。 それから、Selection というのは、オーバーヘッドでロスが出ますから、直したほうがよいと思います。 たぶん、「確定 計」が三個あれば、無限ループになりませんね。 それと、Excel VBAでは、Do ~ Loop は、あまり使わないということです。理由は、行や列がカウント出来るからだと思います。 Sub Test1() Dim i As Long Dim j As Integer Dim LastRow As Long LastRow = Range("B65536").End(xlUp).Row Application.ScreenUpdating = False For i = 8 To LastRow If InStr(Cells(i, 2).Value, "確定 計") > 0 Then LineMaking Cells(i, 2) j = j + 1 If j >= 3 Then Exit For End If Next i Application.ScreenUpdating = True Columns("C:C").EntireColumn.AutoFit Range("A2").Select End Sub Sub LineMaking(rng As Range) Dim v As Variant With rng.Resize(, 16) For Each v In Array(7, 8, 9, 10) With .Borders(v) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Next v With .Interior .ColorIndex = 15 .Pattern = xlSolid .PatternColorIndex = xlAutomatic End With End With End Sub なお、私の経験では、Excel2000 では、 .ColorIndex = xlAutomatic うまく行かないことがあります。その場合は、色番号(1)を指定してください。
お礼
Wendy02さま わざわざプログラミングを書いてくださりありがとうございます。 >まず、これは分散し構造化したほうがよいです。プロシージャの塊は、100行程度までです。 そ、そうなんですね。それじゃ486行っていうのは超長すぎですね。 しかしご指摘のように分散化に技術が必要とのことですので どうにかしのぎながら使っていこうと思います。 どうもありがとうございました。
- ASIMOV
- ベストアンサー率41% (982/2351)
>何かエラー箇所を見つけるいい方法があるでしょうか ツール、マクロ、マクロ で、「編集」ボタンをクリックするとVBAの画面になります そこでファンクションキーの「F8」を押すと、一行ずつ実行されます それで止まる場所が判ると思います
補足
ASIMOVさま アドバイス、ありがとうございます! さっそくF8を押しながらやってみました。 すると止まるところが特定できました。 全部で486行あるマクロなのですが、447行目で止まりました。 下の記述の中の、 「←←←ここ!」という部分です。 しかしここまでわかってもその先の解決法が・・・ どこか見ればわかるよ、というようなサイトなどありますでしょうか。 アドバイスいただければありがたいです。 (もうシロウトレベルじゃ無理でしょうか・・・) ' 「確定 計」行編集 I = 0 Range("B8").Select Do Until I = 3 Selection.End(xlDown).Select If ActiveCell.Value = "確定 計" Then ←←←ここ! ActiveCell.Range("A1:P1").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Interior .ColorIndex = 15 .Pattern = xlSolid .PatternColorIndex = xlAutomatic End With I = I + 1 Else End If Loop Columns("C:C").EntireColumn.AutoFit Range("A2").Select ' End Sub
- lul
- ベストアンサー率41% (10/24)
質問されている内容では詳しい事は分かりませんが、 まずエラーで落ちる箇所をデバッグする所から始めればいいんじゃないでしょうか? エラー箇所の関数もしくは計算式がOffice2003に対応していないんじゃないかと思われますので、その部分をoffice2003で使えるものに置換えてやればいいと思います。
補足
lulさま、早々の回答ありがとうございます。 >まずエラーで落ちる箇所をデバッグ そうなんですよね。しかしそのエラー箇所というのが よくわからないんです。 マクロを走らせると途中でハングアップするんです。 砂時計マークが出て、そのままずぅ~っと止まったまま。 仕方ないのでctrl+alt+delでタスクを終了させるしかなく。 よくVisual Basic のエラーではエラー箇所が黄色になって 教えてくれたりしますが、このケースはただ止まってしまう だけで、エラー箇所がわからないのです。 何かエラー箇所を見つけるいい方法があるでしょうか。
- n-jun
- ベストアンサー率33% (959/2873)
社内(?)的にこの様な場所で公開できないならば、外注委託した方がより使いやすい物が 出来るかも知れませんよ。 例えば数年前とは違い、何か別の作業も追加したいとかにも対応できそうですけど。
お礼
n-junさま 早々に回答をありがとうございます。 本音では外注委託したいです。 しかし当方、零細企業で社長の許可が出そうにありません。 もう少し自分であがいてみることにします。 どうもありがとうございました。
お礼
lulさま 昨日教えていただいた1行を入れたうえで、いろいろ数字を 変えたりして検証してみたところ、うまく動作していました。 どうもありがとうございました。 かれこれ5年以上も、トライしては挫折していたこの問題を 解決してくださり大変感謝しています。 ご自分の技術で人助けができるなんてすばらしいです。 本当にどうもありがとうございました。
補足
lulさま アドバイスありがとうございます。 さっそく指示の1行を追加したところ、途中で止まらず マクロが正常に終了しました。 今日はもう時間がないので(-_-;)、明日改めていろいろ数字を いじって検証してみようと思います。 長年の懸案が解決しそうで、とても感激です。 ちなみにExcel2000では一応動くんですよね。おかしいですか? 取り急ぎ、お礼まで。 また質問させていただくかもしれません。 その際はよろしくお願いいたします。 本当にどうもありがとうございました。