[[20060307131002]] 『シート操作のマクロ・エラー処理』(なっち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シート操作のマクロ・エラー処理』(なっち)Excel2003 WindowsXP

 こんにちは、お邪魔します。

 過去ログにも似たような質問があったのですが、応用ができず、質問させて
 頂こうと思いました。

 特定範囲のセル(それぞれに文字が入力されています)をダブルクリックした時に、
 テンプレートという名前のシートをコピーして末尾に挿入、
 そのコピーされたシートのシート名をダブルクリックしたセルの文字に変更する。
 というマクロを作成しています。
 セルが空白だった場合はマクロ終了。ここまでは、なんとかできたのですが、

 今のコードでは(めちゃくちゃなコードだと思うのですが)
 シート名に使用できない文字や、既に同じ名前のシートがあった場合でも
 テンプレートというシートをコピー・挿入してしまい
 シート名は、テンプレート(2)・・・となってしまいます。

 シート名に使用できない文字や、既に同じ名前のシートがあった場合
 コピーさせずにメッセージを出してマクロを終了する。 
 をどのようにコードにしていいのか解りません。
 どのようにすれば宜しいでしょうか?
 On Error Resume Next これを付け足したらデバックしなくなったので、
 そのままコード内にありますが、
 On Error Resume Next この使い方も理解に苦しんでおります。

 お恥ずかしいですが、下記に現在のコードを掲載させて頂きますので
 宜しくお願い致します。

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim c As String
 c = ActiveCell.Value
 '実行範囲を制限し、範囲以外なら処理を終了します。
 If Intersect(Target, Range("B10:B20")) Is Nothing Then Exit Sub
 'セルが空白だったら
 If Target.Value = "" Then
   MsgBox "選択されたセルには情報(文字)がありません"
 Exit Sub
 End If

 On Error Resume Next
 'Sheet"テンプレート"をコピーして末尾に挿入します。
 Sheets("テンプレート").Copy After:=Sheets(Sheets.Count)
 'コピーされたシートのシート名をダブルクリックしたセルの文字列に変更します。
 ActiveSheet.Name = c 
 End Sub

 'MsgBox "シート名に使用できない文字列か、同じ名前のシートがあります"
 ↑
 こんなメッセージを出して終了せさたいのです。

 どなたかご指導お願い致します。


 Dim statement に wsNew as worksheet を追加

 On Error Resume Next
 '同名のSheetの有無を判断します。
 set wsNew=sheets(target.text)
 if not wsNew is nothing then ' <-もし既に存在したら
   msgbox "だめだこりゃ"
   exit sub
 else
 on error goto 0
'Sheet"テンプレート"をコピーして末尾に挿入します。
 Sheets("テンプレート").Copy After:=Sheets(Sheets.Count)
 'コピーされたシートのシート名をダブルクリックしたセルの文字列に変更します。
 .
 .
 .
 .

 こんな感じで.. (seiya)


 seiyaさん、ありがとうございます。

 >Dim statement に wsNew as worksheet を追加

 これは、Dim c As String, wsNew As Worksheet
 カンマでつなげて書きましたがよろしいでしょうか・・・
 それとも別に(下の行に)書いたほうがいいのでしょうか・・・
 両方で試した結果は特に違いはありませんでした。(違いが解らないのは私だけ?)
 一般的な書き方などありますか?

 On Error Resume Next は on error goto 0 とセット?なのですか?
 on error goto 0 ←このゼロは何を意味するのですか?

 同名のSheetの有無の判断も  なぜ判断できるのか教えて下さい。
 質問ばかりですみません。

 また、シート名に使用できない文字列の場合の処理を回答いただいてから
 考えていますが、難しいです。
 お時間のある時で構いませんので、ヒントなど頂けたら幸いです。

 (なっち)

 > これは、Dim c As String, wsNew As Worksheet
 カンマでつなげて書きましたがよろしいでしょうか・・・

 それで結構です。

 >On Error Resume Next は on error goto 0 とセット?なのですか?

 On Error Resume Next で Errorが発生しても次に進んでいきます。
 が、通常はErrorは発生しないはずなので、On Error GoTo 0 で
 On Error Resume Next を解除しています。

 > また、シート名に使用できない文字列の場合の処理を回答いただいてから
 考えていますが、難しいです。

 もし別々に判断したいのなら、On Error Resume Next の前の段階で、
 Sheetの有無を判断すれば可能だと思います。

 例:
 Dim ws as worksheet, flag as boolean
 for each ws in sheets
   if ws.name=target.text then
       flag=true ' 存在した場合は、flag=true
       msgbox "あった"
       exit for
   end if
 next
 If not flag then ' 存在しなかった場合
   On error resume next
   set wsNew=sheets.add
       ws.name=target.text
   if err.number<>0 then
      msgbox "文字がおかしいかな?"
      exit sub
   else
      on error goto 0 ' On error resume next の解除
      .
      .
      .

 こんな感じでしょうか..
 (seiya)


 seiyaさん、ありがとうございます。
 お礼が遅くなり大変申し訳ございません。
 >例: をせっかく頂いたのに上手く使えず悪戦苦闘しております(T_T)
 大変、恐縮なのですが、私の希望する動作をコードにどう書けばいいのか
 お時間のある時で結構ですので、教えて頂けませんでしょうか?

 希望する動作を下記にまとめました。

 ・特定のセル範囲をダブルクリックした時
 ・テンプレートというシートをコピーして末尾に挿入
 ・コピーされたシートの名前をダブルクリックしたセルの文字に変更
 ・ダブルクリックしたセルが空白だった場合、メッセージを出して終了
 ・既に同じ名前のシートがあった場合、コピーしないでメッセージを出して終了
 ・シート名に使用できない文字だった場合、コピーしないでメッセージを出して終了

 図々しくて本当に申し訳ありません。
 (なっち)


 すみません、一覧(最新更新順)から消えてしまったので
 続けて質問させて下さい。(どうかお許し下さい)
 どうしても希望の動作をすることができません。
 勉強の為と思い、ヒントなど頂けたら・・・と、書き込んでしまったのですが
 行き詰ってしまいました。
 回答下さったseiyaさんにも大変申し訳なく思っております。

 特定のセル範囲をダブルクリックした時
 ・テンプレートというシートをコピーして末尾に挿入
 ・コピーされたシートの名前をダブルクリックしたセルの文字に変更
 しかし
 1・ダブルクリックしたセルが空白だった場合、メッセージを出して終了
 2・既に同じ名前のシートがあった場合、コピーしないでメッセージを出して終了
 3・シート名に使用できない文字だった場合、コピーしないでメッセージを出して終了

 3・の動作をさせることが出来ないのですが、どのようなコードにすれば
 よいでしょうか・・・

 (なっち)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.