Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11695 / 13645 ツリー ←次へ | 前へ→

【14610】上書き保存について YN61 04/6/3(木) 7:41 質問[未読]
【14613】Re:上書き保存について IROC 04/6/3(木) 8:18 回答[未読]
【14652】Re:上書き保存について YN61 04/6/3(木) 20:32 お礼[未読]
【14674】Re:上書き保存について IROC 04/6/4(金) 10:23 回答[未読]
【14691】Re:上書き保存について YN61 04/6/4(金) 22:14 お礼[未読]

【14610】上書き保存について
質問  YN61  - 04/6/3(木) 7:41 -

引用なし
パスワード
   こんにちは、よろしくお願いします。
ワークシートを追加して現在のシートの一部加工したものを貼り付けたいのですが、1度目はスムースに動きますが、2回目はエラーになります。ファイル名が同じだからエラーになることは分かるのですが、上書き処理したいのですがどのようにしたら良いでしょうか。現在のコードは次の通りです。よろしくお願いします。

  Range("A10").Select
  Selection.CurrentRegion.Select
  Selection.Copy
  
  Sheets.Add before:=Worksheets("AAA")
  Range("A2").Select
  ActiveSheet.Paste
   
  ファイル名 = "AAA抽出"
  ActiveSheet.Name = ファイル名
  
  Range("A1").Select

【14613】Re:上書き保存について
回答  IROC  - 04/6/3(木) 8:18 -

引用なし
パスワード
   ファイル名でなくシート名ではないのでしょうか?

同じ名前のシートは2つ作れないです。
なので、シートがあるか判別して、処理を分ければよいと思います。


Sub Sample()
Dim i As Long
Dim シート名 As String
Dim ws As Worksheet

  シート名 = "AAA抽出"

  For i = 1 To Worksheets.Count
    If Worksheets(i).Name = シート名 Then
      GoTo コピー処理
    End If
  Next i
  
  'シート追加
  Set ws = Worksheets.Add(before:=Worksheets("AAA"))
  
  'シート名変更
  ws.Name = シート名

コピー処理:
  ActiveSheet.Range("A10").CurrentRegion.Copy _
  Destination:=Worksheets(シート名).Range("A2")
 
End Sub

【14652】Re:上書き保存について
お礼  YN61  - 04/6/3(木) 20:32 -

引用なし
パスワード
   ▼IROC さん:

早速のご回答ありがとうございました。
VBAを一生懸命しているのですが、上達が遅く、このような回答をいただき大変勉強になりました。

>ファイル名でなくシート名ではないのでしょうか?
ご指摘ありがとうございます。ファイル名ではなくシート名です。失礼しました。

>同じ名前のシートは2つ作れないです。
>なので、シートがあるか判別して、処理を分ければよいと思います。
ありがとうございます。ついついブックの上書き保存のようなことが出来ないかと
思ったのです。これは間違いなんですね。

IROC さんの作っていただいたコードを動かしてみました。
このコードでは、コピーしたシートがあると、コピー操作をしてもエラーがでないと
言う処理のことですね。間違っていますでしょうか。

次の部分のコードの意味は、どのように理解したらよいのでしょうか、よろしければ教えていただけませんでしょうか。

>  For i = 1 To Worksheets.Count
>    If Worksheets(i).Name = シート名 Then
>      GoTo コピー処理
>    End If
>  Next i

本当にありがとうございました。

【14674】Re:上書き保存について
回答  IROC  - 04/6/4(金) 10:23 -

引用なし
パスワード
   >このコードでは、コピーしたシートがあると、コピー操作をしてもエラーがでないと
>言う処理のことですね。間違っていますでしょうか。

エラーによって処理を分けるコードとは異なります。
エラートラップするときは、 On Error〜 の構文を使用します。
その方法でも出来ますが、エラートラップするまでもなく対応できるので、
既記のようなコードを書いてみました。


>次の部分のコードの意味は、どのように理解したらよいのでしょうか、
>よろしければ教えていただけませんでしょうか。

>>  For i = 1 To Worksheets.Count

for 〜 next のループ処理の構文は理解されていますか?
i が 1 から Worksheets.Count(ワークシートの数)だけ変化します。  

VBE で F8キーを押して、ステップ実行させると、
変数の変化が分かるので、処理を理解しやすいと思います。
ステップ実行は活用した方が良いです。

>>    If Worksheets(i).Name = シート名 Then
i=1 のとき Worksheets(1).Name 一番左にあるシートの名前が、
変数(シート名)と同じかどうか判別します。
= でなければ、 i=2,i=3・・ と順にシート名を変数と比較します。

もし一致したら If 〜 End If 内の処理を実行します。
つまり
>>      GoTo コピー処理
です。
これは、ラベル (コピー処理:)の行に処理をジャンプさせる構文です。
なので、
もし、現在のブックに "AAA抽出" というシート名があるときは、
コピー処理:の行にジャンプ。
もし無いときは、

> 'シート追加
>  Set ws = Worksheets.Add(before:=Worksheets("AAA"))
  
>  'シート名変更
>  ws.Name = シート名

を処理することになります。

【14691】Re:上書き保存について
お礼  YN61  - 04/6/4(金) 22:14 -

引用なし
パスワード
   ▼IROC さん:

ご親切な回答ありがとうございました。
大変参考になりました。
これからもよろしくご指導の程お願いします。

11695 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free