Page 58 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼シート追加について bebe 02/9/10(火) 9:52 ┣Re:シート追加について つん 02/9/10(火) 10:22 ┃ ┗Re:シート追加について bebe 02/9/10(火) 10:40 ┗Re:シート追加について りん 02/9/10(火) 10:25 ┗Re:シート追加について bebe 02/9/10(火) 12:36 ┗Re:シート追加について(関数化) りん 02/9/10(火) 12:51 ┗良い感じですね。 bebe 02/9/10(火) 16:21 ─────────────────────────────────────── ■題名 : シート追加について ■名前 : bebe ■日付 : 02/9/10(火) 9:52 -------------------------------------------------------------------------
多分とても初歩的なことなのですが あるBook内にシートを追加しようとしています。 Sub Macro() Dim sheetname As String '---------シート追加------------ sheetname = ActiveSheet.Name & "展開後" Sheets("イメージ").Copy After:=Sheets(5) Sheets("イメージ (2)").Name = sheetname End Sub この場合、Sheetnameと同じ名前のシートが既に存在する時は "イメージ"シートのコピーをしないようにしたいのですが、 どうコードを書けば良いかわかりません。 よろしくお願いします。 |
おはようございます。 >この場合、Sheetnameと同じ名前のシートが既に存在する時は >"イメージ"シートのコピーをしないようにしたいのですが、 >どうコードを書けば良いかわかりません。 >よろしくお願いします。 こんな感じかな? Sub test() Dim sheetname As String Dim ws As Worksheet sheetname = ActiveSheet.Name & "展開後" For Each ws In Worksheets If ws.Name = sheetname Then MsgBox "すでに同じシート名のシートがあります" Exit Sub End If Next ws ActiveSheet.Copy After:=Sheets(Sheets.Count) ActiveSheet.Name = sheetname End Sub ちょっと、されたいと思われてる処理がいまいち把握できなかったんですけど、 だいたいこんな感じかな? 一度試してくださいませ。 |
▼つん さん: うまくいきました。実は、最初に書いたコードの後には 追加したシートにデータを入れていく作業をしています。 もともとブック内にその名前のシートがあれば、 データを上書きしたかったので、こんな感じにしました。 Sub Macro() Dim sheetname As String Dim hantei As Integer hantei = 0 sheetname = ActiveSheet.Name & "展開後" motosheet = ActiveSheet.Name For Each ws In Worksheets If ws.Name = sheetname Then hantei = 1 End If Next ws If hantei = 0 Then Sheets("イメージ").Copy After:=Sheets(5) Sheets("イメージ (2)").Name = sheetname End If ・・・・ (データ入力のコード) ・・・・ End Sub hanteiはBoolean型で良かったのかな?まあいいや。 助かりました。 有難うございました。 |
bebeさん、おはようございます。 >この場合、Sheetnameと同じ名前のシートが既に存在する時は >"イメージ"シートのコピーをしないようにしたいのですが、 ひとつづつチェックする方法もありますが、オブジェクト変数にセットしてみて、失敗した(シートがなかった)ら追加してみました。 Sub Macro() Dim sheetname As String Dim sh As Object '---------シート追加------------ sheetname = ActiveSheet.Name & "展開後" On Error Resume Next Set sh = Sheets(sheetname) On Error GoTo 0 '取得に失敗したらコピー If sh Is Nothing Then Sheets("イメージ").Copy After:=Sheets(5) Sheets(6).Name = sheetname Else MsgBox "既存", vbInformation End If Set sh = Nothing End Sub こんな感じです。 Dim sh As Object としているのは、Sheetというオブジェクト型がないからで、グラフシート(ワークシート以外)が無いならば、 Dim sh As WorkSheet でいいです。 |
▼りん さん: >bebeさん、おはようございます。 > >>この場合、Sheetnameと同じ名前のシートが既に存在する時は >>"イメージ"シートのコピーをしないようにしたいのですが、 > >ひとつづつチェックする方法もありますが、オブジェクト変数にセットしてみて、失敗した(シートがなかった)ら追加してみました。 > >Sub Macro() > Dim sheetname As String > Dim sh As Object > '---------シート追加------------ > sheetname = ActiveSheet.Name & "展開後" > On Error Resume Next > Set sh = Sheets(sheetname) > On Error GoTo 0 > '取得に失敗したらコピー > If sh Is Nothing Then > Sheets("イメージ").Copy After:=Sheets(5) > Sheets(6).Name = sheetname > Else > MsgBox "既存", vbInformation > End If > Set sh = Nothing >End Sub > >こんな感じです。 > > Dim sh As Object >としているのは、Sheetというオブジェクト型がないからで、グラフシート(ワークシート以外)が無いならば、 > Dim sh As WorkSheet >でいいです。 こちらも試してみたらうまく行きました。 有難うございます。 |
bebeさん、こんにちわ。 Sub Macro() Dim sheetname As String, motosheet As String ' motosheet = ActiveSheet.Name sheetname = motosheet & "展開後" ' If hantei(ActiveWorkbook, sheetname) = False Then Sheets("イメージ").Copy After:=Sheets(5) Sheets("イメージ (2)").Name = sheetname End If '・・・・ '(データ入力のコード) '・・・・ End Sub '関数化 Function hantei(wb As Workbook, s1 As String) As Boolean '汎用性をもたせるためにブックを指定できるようにしてあります。 Dim sh As Object On Error Resume Next Set sh = wb.Sheets(s1) On Error GoTo 0 '結果 hantei = Not sh Is Nothing '解放 Set sh = Nothing End Function 関数化したらこんな感じです。 |
▼りん さん: >bebeさん、こんにちわ。 > >Sub Macro() > Dim sheetname As String, motosheet As String > ' > motosheet = ActiveSheet.Name > sheetname = motosheet & "展開後" > ' > If hantei(ActiveWorkbook, sheetname) = False Then > Sheets("イメージ").Copy After:=Sheets(5) > Sheets("イメージ (2)").Name = sheetname > End If >'・・・・ >'(データ入力のコード) >'・・・・ >End Sub >'関数化 >Function hantei(wb As Workbook, s1 As String) As Boolean > '汎用性をもたせるためにブックを指定できるようにしてあります。 > Dim sh As Object > On Error Resume Next > Set sh = wb.Sheets(s1) > On Error GoTo 0 > '結果 > hantei = Not sh Is Nothing > '解放 > Set sh = Nothing >End Function > >関数化したらこんな感じです。 おお〜。こんな事もできるんだ。。。 VBAで関数化とかまだあまりした事が無いですが、 なかなかすっきりしていいかんじですね。 りんさんはいつも親切な回答で感心しております。 もっと勉強して色々使えるようになりたいです。。。 有難うございました。 |