アプリ版:「スタンプのみでお礼する」機能のリリースについて

Windows XP Home Edition
Excel 2002

下記1のマクロの実行後に必ず、
編集→置換をクリックしますと、画像の画面が出ます。
そしてExelを再起動すると、編集→置換をクリックしても問題なく使用できます。
しかし、再度、下記1のマクロを実行後、
●編集→置換をクリック→画像の画面が出ます。
何回、行ってみても同じです。←このような事はよくあるのでしょうか?

下記1のマクロ自体は、正常に動作します。
しかし、
次の作業で、別のマクロを実行しますと、動作はするのですが、
下記2の一部のコードの「置換」が行われなくなります。
素通りしてしまいます。非常に困ります。
しかし、この「別のマクロ」に On Error Resume Next を追記すると
 動作します(コードの「置換」も行われます)。
 しかし、この直後も必ず、●編集→置換をクリック→画像の画面が出ます。

下記1の「いい」マクロだけを除いて実行するマクロは問題はありません。
ですから、次の作業で、下記2の一部のコード(置換)も、
On Error Resume Next を追記しなくても正常動作してくれます。

どうも、「下記1」の「いい」に問題があるように思いますが・・・
つなぎ合わせ過ぎでしょうか・・・
原因がはっきり解かりませんが、ただ、今までに、マクロの実行作業中にあまり、
「編集→置換をクリック」の操作はしたこはないので、発覚することがなかったのかもしれません。
●をなんとか解決できませんでしょうか?
参考:下記2の#DIV/0! #VALUE! は、数値以外の空白セル 、0 、文字等の為になります。
   (これは直接的な原因ではないと思います)
何卒、よろしくお願い致します。


  Call 下記1

Private Sub 下記1()
  Call いい
  Call うう
  Call ええ
  Call おお
End Sub

Private Sub いい()
Dim i As Integer
Dim nin As Range

Windows("123.xls").Activate
  Sheets.Add after:=Worksheets(Worksheets.Count), Count:=1

 For i = 1 To Worksheets.Count - 1

 Worksheets(i).Activate

 With Worksheets(i)
  For Each nin In .Range("B4", .Range("B4").End(xlDown))
  If nin.Cells.Value = 1 Then
   nin.Offset(0, -1).Copy Cells(2, 6)
  End If
 Next nin
End With

  Call かか

   Range("A23", Range("A23").End(xlDown)).Copy _
   Destination:=Worksheets(Worksheets.Count).Range("IV3").End(xlToLeft).Offset(0, 1)

Next i
End Sub

Private Sub かか()

Dim fWord As Integer, fAdd, c
  fWord = Cells(2, 6).Value

   Range("L3").Copy Range("A23")

 With Range("G:G")
   Set c = .Find(fWord, LookIn:=xlValues, LookAt:=xlWhole)
   If Not c Is Nothing Then
    fAdd = c.Address
    Do
     c.Offset(0, 5).Copy
     Range("A65536").End(xlUp). _
     Offset(1, 0).PasteSpecial Paste:=xlAll, _
      Transpose:=True
     Set c = .FindNext(c)
     Loop While Not c Is Nothing And c.Address <> fAdd
    End If
    Set c = Nothing

 End With

  '次に、同様にH列にも動作させる
 With Range("H:H")
   Set c = .Find(fWord, LookIn:=xlValues, LookAt:=xlWhole)
   If Not c Is Nothing Then
    fAdd = c.Address
    Do
    c.Offset(0, 4).Copy
    Range("A65536").End(xlUp). _
    Offset(1, 0).PasteSpecial Paste:=xlAll, _
     Transpose:=True
    Set c = .FindNext(c)
    Loop While Not c Is Nothing And c.Address <> fAdd
   End If
    Set c = Nothing

  End With
End Sub
ーーーーーーーーーーーーーーーーーーーーー
'下記2
  With Range(Range("A2").End(xlDown).Offset(3, 6), Range("A65536").End(xlUp).Offset(0, 25))
   .Replace What:="#DIV/0!", Replacement:="0.0", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

   .Replace What:="#VALUE!", Replacement:="0.0", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
 End With

「Excelでマクロ実行後、編集→置換をク」の質問画像

A 回答 (4件)

#ぁー…失礼。

なかなかhitしなかったもので...orz

『[XL2002] プログラムから Range.Find 操作を実行した後に置換機能が機能しなくなる』
http://support.microsoft.com/kb/322007/

強制終了の現象ではありませんが、関連しているのかもしれません。
Service Pack 2 で解消されているようです。
XPはService Pack 3 が最新ですか。それを適用すれば解消する可能性が高いです。
    • good
    • 0
この回答へのお礼

>Excel2002のアップデートは定期的に実行してますか?
XPはService Pack 3でしたが、
Office は全く行っておりませんでした。

ズバリのサポートページがあったんですね!
私の不慣れでページ検索等に時間がかかりましたが、
Service Pack 2でばっちり解決できました。
私側の何かのトラブルの原因だろうと思っており、
解決できるとは思っておりませんでした。
きっちりコードまでも提示して頂き、
この度は、誠に有難うございました。

お礼日時:2010/03/26 23:07

Excel2002のアップデートは定期的に実行してますか?


修正プログラムをチェックし、最新の状態にしておいたほうがいいですよ。
Microsoft Updateで確認してみてください。


それで解消しない場合、以下のコードではどうでしょう。

Private Sub test()
  Dim fWord As Variant
  Dim fAdd As String
  Dim c   As Range

  fWord = Cells(2, 6).Value
  If Not IsNumeric(fWord) Then MsgBox "error data": Exit Sub
  Range("L3").Copy Range("A23")
  With ActiveSheet.UsedRange.Columns("G:H")
    Set c = .Find(What:=CStr(fWord), _
           After:=.Cells(1), _
           LookIn:=xlValues, _
           LookAt:=xlWhole, _
           SearchOrder:=xlByColumns, _
           SearchDirection:=xlNext, _
           MatchByte:=False)
    If Not c Is Nothing Then
      fAdd = c.Address
      Do
        Cells(c.Row, "L").Copy
        Range("A65536").End(xlUp). _
            Offset(1, 0).PasteSpecial Paste:=xlAll, _
                         Transpose:=True
        Application.CutCopyMode = False
        Set c = .FindNext(c)
        If c Is Nothing Then Exit Do
      Loop While c.Address <> fAdd
    End If
  End With
  Application.CutCopyMode = False
  Set c = Nothing
  'Cells.Find ""
End Sub

効果なければ最後の
'Cells.Find ""
を非コメントにして活かしてみてください。

Findメソッドの設定を引きずる点に障害があるような気がしますね。
What:=CStr(fWord)...で文字列として明示してみてどうなるか、
Cells.Find ""...で検索値をクリアしてみてどうなるか、
試してみてください。
    • good
    • 0

>>何回、行ってみても同じです。

←このような事はよくあるのでしょうか?
>よくある事ではないと思いますが。

私にも、VBAとしてのある組み合わせで起こる、同様のアプリケーションレベルのハングがあります。
その組み合わせをしないようにすればよいのですが、時々、失敗してしまいます。

ご質問の件で、こちらの考えを単刀直入に言うと、個々のコードは統合すると全体的に無理がでるようです。コードは、めまぐるしくオブジェクトが移動しているようです。たとえでいうなら、大型車で、町中をあちこちを郵便配達でもするような感じです。勢いで走ってはいても、途中でガソリン(メモリ)がなくなって、次の始動では、動かなくなってしまうのかもしれません。たぶん、ガソリンタンクの大きなもの(上位バージョン)なら、問題は起こらないかもしれません。

ある程度の大きさのシートを扱うのに、VBのようにつなげてしまいますと、個々の問題はでなくても、サブルーチンで扱ったオブジェクトの痕跡を残したまま、次につなげていますから、それが累積して、問題が発生するのだと思います。理屈では、そうやってつなげれば続いていくように思うかもしれませんが、Excel VBAの数メガの、限られたメモリの中でやりくりしているわけですから、そう思い通りになりませんね。

具体的なコードは示しませんが、Findメソッドをやめて、オートフィルタなどを使って、それをコピーしたほうがよいです。Find メソッドと、検索・置換コマンドは、同じエンジンを使いながら直結していませんから、もしかしたら、そこにバグが存在しているかもしれません。もう、ここらになると、ご自身で解決していかなくてはならないと思います。

それに、個々のコードには甘さが残っています。たぶん、それぞれはエラーはでないし、個々のコードとしては、掲示板としては、合格ランクに入るけれども、ワンランク上のコードにするには、もう少し、きちっと親オブジェクト(Bookやシート)を明示して、書いたほうがよいですね。それで、エラーが発生しなくなるということではありませんが。

もし、現状のままなら、ともかく、サブルーチンで全部つなげようとしないことですね。

それと、以下は問題ありませんが、このように範囲を限定する必要があるのでしょうか?
また、私のほうでは、Replaceメソッドでは置換は出来ません。Versionの違いだと思います。
それに、0.0 としても、書式が、0.0になっていなければ表示しません。数字を入れると数値に変わるという、型のキャスティングが起きてしまい、セルの書式に反映されてしまいます。

> With Range(Range("A2").End(xlDown).Offset(3, 6), Range("A65536").End(xlUp).Offset(0, 25))
>  .Replace What:="#DIV/0!", Replacement:="0.0", LookAt:=xlPart, _
>   SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
>   ReplaceFormat:=False

私なら、こう書きます。
ただし、エラー値は、数式であることが条件です。.Range("A2").End(xlDown) ここは微妙です。(= 甘さが残っています。→エラーや失敗の可能性があります。)
'-------------------------------------------
 Dim r As Range
 With ActiveSheet
   With .Range(.Range("A2").End(xlDown).Offset(3, 6), _
          .Range("A65536").End(xlUp).Offset(0, 25))
     On Error Resume Next
     Set r = .SpecialCells(xlCellTypeFormulas, xlErrors)
     On Error GoTo 0
   End With
 End With
 If Not r Is Nothing Then
   r.Value = 0
 End If
'-------------------------------------------
p.s.OkWaveの改編に伴ない、掲示板の雰囲気も変わり、今までの常連は肩身も狭くなりましたね。もう前のような発言をしていくことはやめることにしました。
    • good
    • 0
この回答へのお礼

よく見ますと、
回答を締め切った後でも「お礼をつける」ことができたのですね。
本ページの各投稿欄の記載が長文かつ画面が長くなってたこともありまして、
Wendy02様の投稿を見落としてしまいました。
私が、あわてていて、せっかくご回答して頂いたのに、「お礼をつける」ことがもおできないと思っておりました。
遅ればせながらですが、
ご回答、どうも有難うございました。

お礼日時:2010/03/29 02:59

>●編集→置換をクリック→画像の画面が出ます。


>何回、行ってみても同じです。←このような事はよくあるのでしょうか?
よくある事ではないと思いますが。
ちょっと似た事例だと
http://oshiete1.goo.ne.jp/qa5526385.html

例えば新規Bookに各シートのセル範囲をコピーして
VBAコードもコピーして移設し、試した場合どうなるか調べてみてはどうでしょう。
(Bookやシートのコピーではなく、データやコードのみコピー)
それでも発生するなら
同PCに別ユーザーでログインして試してみるとか
可能なら別PCで試してみるとか。

特定のシートやBookの現象なのか、
特定のユーザー環境での現象なのか、
特定のPCでの環境なのか、
それによって解決のアプローチも変わってくるかと思います。

他PCのExcel2002で、かつ移設した新規Bookでも発生するなら
データかVBAコードに原因があるのかもしれません。
その場合、現在ご提示の情報だけでは判断は難しいです。
>どうも、「下記1」の「いい」に問題があるように思いますが・・・
との事ですが、
>しかし、再度、下記1のマクロを実行後、
>●編集→置換をクリック→画像の画面が出ます。
この下記1のマクロではなく
Private Sub いい() を単独で実行後『編集→置換』でも強制終了しますか?

検索がらみなのでコードをちょっと見直してみてもいいかもしれませんが。
Private Sub かか()
  Dim fWord As Variant
  Dim fAdd As String
  Dim c   As Range

  fWord = Cells(2, 6).Value
  If Not IsNumeric(fWord) Then MsgBox "error data": Exit Sub
  fWord = CLng(fWord)
  Range("L3").Copy Range("A23")
  With ActiveSheet.UsedRange.Columns("G:H")
    Set c = .Find(What:=fWord, _
           After:=.Cells(1), _
           LookIn:=xlValues, _
           LookAt:=xlWhole, _
           SearchOrder:=xlByColumns, _
           SearchDirection:=xlNext, _
           MatchCase:=False)
    If Not c Is Nothing Then
      fAdd = c.Address
      Do
        Cells(c.Row, "L").Copy
        Range("A65536").End(xlUp). _
            Offset(1, 0).PasteSpecial Paste:=xlAll, _
                         Transpose:=True
        Application.CutCopyMode = False
        Set c = .FindNext(c)
        If c Is Nothing Then Exit Do
      Loop While c.Address <> fAdd
    End If
  End With
  Application.CutCopyMode = False
  Set c = Nothing
End Sub

もしくは、メニューがらみという事もあり、『xlbファイル』の再構築を試みてもいいかも。
http://support.microsoft.com/kb/880939/JA



また、
>下記2の一部のコードの「置換」が行われなくなります。
>素通りしてしまいます。...
こちらのほうは、検索対象が数式の結果の#DIV/0!や#VALUE!のままで、値化されていないので
検索にひっかかっていないという可能性はないですか?
素通りした時に、念のため確認してみてください。

この回答への補足

早速のご回答誠に有難うございます。

単独で実行等してみました。
そして
>例えば新規Bookに各シートのセル範囲をコピーして
>VBAコードもコピーして移設し、試した場合どうなるか調べてみてはどうでしょう。
>(Bookやシートのコピーではなく、データやコードのみコピー)
も行ってみました。
が、必ず、●編集→置換をクリック→画像の画面が出ます。

現時点では、
Call かか
だけに、間違いなく原因があると思われます。
必ず、●編集→置換をクリック→画像の画面が出ます。

ただ、上記●の直前に★編集→検索→置換をクリック→閉じる をしてから
○編集→置換をクリック と行いますと全く問題はありません。

>同PCに別ユーザーでログインして試してみるとか
やり方がよくわかりませんので、調べてみます。

>可能なら別PCで試してみるとか。
これから、行ってみます。

補足日時:2010/03/24 01:20
    • good
    • 0
この回答へのお礼

どうも有難うございます。
>可能なら別PCで試してみるとか。
別PC(Excel 2003)は全く問題ありませんでした。
別PC(Excel 2002、ExcelがインストールされていないPCへ、私のPCと同Excel 2002を純正ソフトからインストールしました)
 は、必ず●となり、●の直前に★編集→検索→置換をクリック→閉じる をしてから
 ○編集→置換をクリック と行いますと全く問題はありません。
 私のPCと全く同じ結果でした。

ご提示して頂きましたコードも同様に、●となりました(私のPCだけで行いました)。
 でも、このコードのほうがきっちり安全安心、かつ早いので使用させて頂きます。

現時点の結論は、Excel 2002自体に問題があり、そして「Call かか」との相性に問題があるように思われます。
恐れ入ります。
現時点でおわかりになる範囲で結構ですので、原因であろう箇所がおわかりでしたら、
簡単にその箇所だけで結構ですので、教えて下さればと思っております。
お時間のおありの時で結構でございます。

お礼日時:2010/03/26 03:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!