過去ログ

                                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と同じ名前のシートが既に存在する時は
"イメージ"シートのコピーをしないようにしたいのですが、
どうコードを書けば良いかわかりません。
よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:シート追加について  ■名前 : つん <honey@sweetparty.ne.jp>  ■日付 : 02/9/10(火) 10:22  -------------------------------------------------------------------------
   おはようございます。

>この場合、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

ちょっと、されたいと思われてる処理がいまいち把握できなかったんですけど、
だいたいこんな感じかな?
一度試してくださいませ。
 ───────────────────────────────────────  ■題名 : Re:シート追加について  ■名前 : bebe  ■日付 : 02/9/10(火) 10:40  -------------------------------------------------------------------------
   ▼つん さん:
うまくいきました。実は、最初に書いたコードの後には
追加したシートにデータを入れていく作業をしています。
もともとブック内にその名前のシートがあれば、
データを上書きしたかったので、こんな感じにしました。
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型で良かったのかな?まあいいや。
助かりました。
有難うございました。
 ───────────────────────────────────────  ■題名 : Re:シート追加について  ■名前 : りん <rin_doggie@hotmail.com>  ■日付 : 02/9/10(火) 10:25  -------------------------------------------------------------------------
   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
でいいです。
 ───────────────────────────────────────  ■題名 : Re:シート追加について  ■名前 : bebe  ■日付 : 02/9/10(火) 12:36  -------------------------------------------------------------------------
   ▼りん さん:
>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
>でいいです。

こちらも試してみたらうまく行きました。
有難うございます。
 ───────────────────────────────────────  ■題名 : Re:シート追加について(関数化)  ■名前 : りん <rin_doggie@hotmail.com>  ■日付 : 02/9/10(火) 12:51  -------------------------------------------------------------------------
   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  ■日付 : 02/9/10(火) 16:21  -------------------------------------------------------------------------
   ▼りん さん:
>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で関数化とかまだあまりした事が無いですが、
なかなかすっきりしていいかんじですね。
りんさんはいつも親切な回答で感心しております。

もっと勉強して色々使えるようになりたいです。。。

有難うございました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 58