Excel VBA質問箱 IV

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

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


10073 / 13644 ツリー ←次へ | 前へ→

【23850】シートを異なるブックへコピーしたい okb 05/4/5(火) 21:07 質問[未読]
【23852】Re:シートを異なるブックへコピーしたい ちゃっぴ 05/4/5(火) 21:20 回答[未読]
【23854】Re:シートを異なるブックへコピーしたい okb 05/4/5(火) 22:04 質問[未読]
【23856】Re:シートを異なるブックへコピーしたい ちゃっぴ 05/4/5(火) 22:25 回答[未読]
【23861】Re:シートを異なるブックへコピーしたい okb 05/4/5(火) 23:18 質問[未読]
【23863】Re:シートを異なるブックへコピーしたい ちゃっぴ 05/4/5(火) 23:31 回答[未読]
【23864】Re:シートを異なるブックへコピーしたい ウッシ 05/4/6(水) 0:24 回答[未読]
【23866】Re:シートを異なるブックへコピーしたい okb 05/4/6(水) 1:08 発言[未読]
【23867】Re:シートを異なるブックへコピーしたい ウッシ 05/4/6(水) 8:35 回答[未読]
【23872】Re:シートを異なるブックへコピーしたい okb 05/4/6(水) 10:52 お礼[未読]
【23865】Re:シートを異なるブックへコピーしたい okb 05/4/6(水) 0:43 質問[未読]
【23853】Re:シートを異なるブックへコピーしたい ウッシ 05/4/5(火) 21:27 回答[未読]
【23855】Re:シートを異なるブックへコピーしたい okb 05/4/5(火) 22:16 発言[未読]

【23850】シートを異なるブックへコピーしたい
質問  okb  - 05/4/5(火) 21:07 -

引用なし
パスワード
   度々、お世話になります。
オープンされている、2つのブックの一方の1つのシートを、コピーしてもう一方のブックに追加するマクロをつくりましたが、うまく動作しません。

Sub シートのコピー()
  Dim myBook As Workbook
  Dim Bookname As String
  Dim I As Long, j As Long
  Dim Shname As Variant
  Sheets("Menu").Select
  For j = 4 To 10 Step 3
   For I = 5 To 29 Step 2
    If Cells(I, j).Value <> "" And Cells(I, j - 1).Value <> "" Then
        Shname = Trim(Cells(I, j - 1).Value)
        Exit For
     End If
   Next I
  Next j
  For Each myBook In Workbooks    '開かれたBookのチェック
    If myBook.Name <> ThisWorkbook.Name Then
      Bookname = myBook.Name
      Exit For
    End If
  Next
  MsgBox (Bookname & " " & Shname)
   MsgBoxでは、正常に見えます。
  Sheets(Shname).Select
   上記で、インデックスが有効範囲でない旨のエラー
  Sheets(Shname).Copy before:=Workbooks(Bookname).Sheets(1)
End Sub

ご教示、ご指摘方よろしく、お願いします。

【23852】Re:シートを異なるブックへコピーしたい
回答  ちゃっぴ  - 05/4/5(火) 21:20 -

引用なし
パスワード
   >  Sheets(Shname).Select

ShnameというSheetがActiveなWorkbookに存在しないのでは?

> Dim Shname As Variant

Variant宣言しているのは、何か意図がありますか?
Stringでは?

あと、Selectは使用しないほうがいいですよ。
複数のBookを扱うのですから、Sheets(〜)とかではなく
Workbooks(〜).Worksheet(〜)で修飾してやったほうがいいです。

毎回書くのがめんどくさかったらWithとかObject変数とか使用してやりましょう。

【23853】Re:シートを異なるブックへコピーしたい
回答  ウッシ  - 05/4/5(火) 21:27 -

引用なし
パスワード
   こんばんは

>   MsgBoxでは、正常に見えます。
これは本当ですよね?

Shnameは数字ですか?

'  Sheets(Shname).Select  '削除またはコメントアウト
  Thisworkbook.Sheets(Cstr(Shname)).Copy _
       before:=Workbooks(Bookname).Sheets(1)


とするとどうなりますか?

2重ループの内側の「Exit For」は危ういです、意図した結果が出ているようですけど。

>If myBook.Name <> ThisWorkbook.Name
もPERSONAL.XLSが有ったら・・・

どのブックのどのシートとか、どのブックのどのシートのセルとかを
Workbooks(Bookname).Sheets(1).Range("A1")
のように明示するようにした方がいいですよ。

【23854】Re:シートを異なるブックへコピーしたい
質問  okb  - 05/4/5(火) 22:04 -

引用なし
パスワード
   >ShnameというSheetがActiveなWorkbookに存在しないのでは?
いいえ、存在します。MsgBoxで確認しています。
>Variant宣言しているのは、何か意図がありますか?
>Stringでは?
意図は、ありません。Stringにしました。
次のようにしました、現象は変わりません。

Sub シートのコピー()
  Dim myBook As Workbook
  Dim Bookname As String
  Dim I As Long, j As Long
  Dim Shname As String
  For j = 4 To 10 Step 3
   For I = 5 To 29 Step 2
       Sheets("Menu").Select
     If Cells(I, j).Value <> "" And Cells(I, j - 1).Value <> "" Then
        Shname = Trim(Cells(I, j - 1).Value)
        Exit For
     End If
   Next I
  Next j
  For Each myBook In Workbooks    '開かれたBookのチェック
    If myBook.Name = ThisWorkbook.Name Then
    Else
      Bookname = myBook.Name
      Exit For
    End If
  Next
  MsgBox (Bookname & " " & Shname)
  Workbooks(Bookname).Worksheet(Shname).Select
    やはり、上でこけます。
  Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)
End Sub

【23855】Re:シートを異なるブックへコピーしたい
発言  okb  - 05/4/5(火) 22:16 -

引用なし
パスワード
   >>   MsgBoxでは、正常に見えます。
>これは本当ですよね?
はい、間違いありません。
>
>Shnameは数字ですか?
日本語です。

結局、次のようにしましたが、現象は変わりません。
Sub シートのコピー()
  Dim myBook As Workbook
  Dim Bookname As String
  Dim I As Long, j As Long
  Dim Shname As String
  For j = 4 To 10 Step 3
   For I = 5 To 29 Step 2
       Sheets("Menu").Select
     If Cells(I, j).Value <> "" And Cells(I, j - 1).Value <> "" Then
        Shname = Trim(Cells(I, j - 1).Value)
        Exit For
     End If
   Next I
  Next j
  For Each myBook In Workbooks    '開かれたBookのチェック
    If myBook.Name = ThisWorkbook.Name Then
    Else
      Bookname = myBook.Name
      Exit For
    End If
  Next
  MsgBox (Bookname & " " & Shname)
  'Workbooks(Bookname).Worksheet(Shname).Select
  'Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)
  ThisWorkbook.Sheets(CStr(Shname)).Copy _
       before:=Workbooks(Bookname).Sheets(1)
End Sub

【23856】Re:シートを異なるブックへコピーしたい
回答  ちゃっぴ  - 05/4/5(火) 22:25 -

引用なし
パスワード
   ですから、CellとかにAccessする際、Workbook, WorkSheetは
明示しましょうといっているのです。

>     If Cells(I, j).Value <> "" And Cells(I, j - 1).Value <> "" Then
       ~~~~~~~~~~~~~~~~~      ~~~~~~~~~~~~~~~~~~~~~
修飾がないですよね。

With Thisworkbook.Worksheets("Menu")
  If .Cells(I, j).Value <> "" And .Cells(I, j - 1).Value <> "" Then
End With

このようにして修飾しましょうと言うことです。

あと、CopyしたいSheet(shname)がどのBookにあるか教えてください。
ついでに、"Menu" Sheetも・・・

>いいえ、存在します。MsgBoxで確認しています。

Programで怒られているのは、存在しないからですよ。
どこのBookに存在するかよくお確かめください。

【23861】Re:シートを異なるブックへコピーしたい
質問  okb  - 05/4/5(火) 23:18 -

引用なし
パスワード
   >ですから、CellとかにAccessする際、Workbook, WorkSheetは
>明示しましょうといっているのです。
すみません。下記でいいでしょうか?
実行結果は同じでしたが…。
Sub シートのコピー()
  Dim myBook As Workbook
  Dim Bookname As String
  Dim I As Long, j As Long
  Dim Shname As String
  With ThisWorkbook.Worksheets("Menu")
    For j = 4 To 10 Step 3
     For I = 5 To 29 Step 2
          .Select
       If .Cells(I, j).Value <> "" And .Cells(I, j - 1).Value <> "" Then
          Shname = Trim(.Cells(I, j - 1).Value)
          Exit For
       End If
     Next I
    Next j
   End With
   For Each myBook In Workbooks    '開かれたBookのチェック
     If myBook.Name = ThisWorkbook.Name Then
     Else
       Bookname = myBook.Name
       Exit For
     End If
   Next
   MsgBox (Bookname & " " & Shname)
   Workbooks(Bookname).Worksheet(Shname).Select
   Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)
End Sub

>あと、CopyしたいSheet(shname)がどのBookにあるか教えてください。
>ついでに、"Menu" Sheetも・・・
ABC.xlsに"Menu" Sheet、Sheet(shname)が存在します。
xyz.xlsへSheet(shname)をコピー
MsgBoxには、XYZ.xls shnameが表示されます。

>Programで怒られているのは、存在しないからですよ。
意味が、わかりません。

【23863】Re:シートを異なるブックへコピーしたい
回答  ちゃっぴ  - 05/4/5(火) 23:31 -

引用なし
パスワード
   >   Workbooks(Bookname).Worksheet(Shname).Select
>   Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)

これですと、

Workbooks(Bookname).Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)

ということです。書き下すと・・

Bookname Book の shname Sheet を Bookname Book の 1番目のSheetの後に
Copyしますということです。

これを実行するとき、Bookname (XYZ.xls)に shname という名前のSheetは
存在しますか?

ということです。 

【23864】Re:シートを異なるブックへコピーしたい
回答  ウッシ  - 05/4/6(水) 0:24 -

引用なし
パスワード
   こんばんは

マクロブック名が「ABC.xls」ですよね?

これでメッセージを確認してみて下さい。

Sub シートのコピー()
  Dim myBook As Workbook
  Dim Bookname As String
  Dim I As Long, j As Long
  Dim Shname As String
  With ThisWorkbook.Worksheets("Menu")
    For j = 4 To 10 Step 3
      For I = 5 To 29 Step 2
        If .Cells(I, j).Value <> "" And .Cells(I, j - 1).Value <> "" Then
          Shname = Trim(.Cells(I, j - 1).Value)
          Exit For
        End If
      Next I
    Next j
  End With
  For Each myBook In Workbooks    '開かれたBookのチェック
    If myBook.Name = ThisWorkbook.Name Then
    Else
      Bookname = myBook.Name
      Exit For
    End If
  Next
  
  MsgBox "コピー先ブック名:" & Workbooks(Bookname).Name & vbCrLf _
      & "コピー元シート名:" & ThisWorkbook.Worksheets(Shname).Name
      
  ThisWorkbook.Worksheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)
End Sub

【23865】Re:シートを異なるブックへコピーしたい
質問  okb  - 05/4/6(水) 0:43 -

引用なし
パスワード
   >Workbooks(Bookname).Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)
>Bookname Book の shname Sheet を Bookname Book の 1番目のSheetの後に
>Copyしますということです。
すみません。ここがおかしいですね。
Workbooks(ThisWorkBokk.Name).Sheets(Shname).Copy after:=Workbooks(Bookname).Sheets(1)
としたのですが、ダメでした。
ThisWorkBook.name--- ABC.xls
Bookname-------------XYZ.xls

>これを実行するとき、Bookname (XYZ.xls)に shname という名前のSheetは
>存在しますか?
存在しません、ABC.xlsに存在します。

【23866】Re:シートを異なるブックへコピーしたい
発言  okb  - 05/4/6(水) 1:08 -

引用なし
パスワード
   お手数かけます。
>  MsgBox "コピー先ブック名:" & Workbooks(Bookname).Name & vbCrLf _
>      & "コピー元シート名:" & ThisWorkbook.Worksheets(Shname).Name
ここで、エラーになりました。
MsgBox Workbooks(Bookname).Name
MsgBox Shname
MsgBox ThisWorkbook.Name
ここまでは、正常です。
MsgBox ThisWorkbook.Worksheets(Shname).Name
ここで、エラーでした。

【23867】Re:シートを異なるブックへコピーしたい
回答  ウッシ  - 05/4/6(水) 8:35 -

引用なし
パスワード
   こんにちは、

▼okb さん:
>ThisWorkBook.name--- ABC.xls
>Bookname-------------XYZ.xls
>>  MsgBox "コピー先ブック名:" & Workbooks(Bookname).Name & vbCrLf _
>>      & "コピー元シート名:" & ThisWorkbook.Worksheets(Shname).Name
>ここで、エラーになりました。
>MsgBox Workbooks(Bookname).Name
>MsgBox Shname
>MsgBox ThisWorkbook.Name
>ここまでは、正常です。
>MsgBox ThisWorkbook.Worksheets(Shname).Name
>ここで、エラーでした。

とすると、
>Shname = Trim(.Cells(I, j - 1).Value)
の処理後の「Shname」と実際のシートに空白等の違いが有るという事では?

【23872】Re:シートを異なるブックへコピーしたい
お礼  okb  - 05/4/6(水) 10:52 -

引用なし
パスワード
   コピー側から、実行ように修正すると、うまくいきました。
大変、お騒がせしました。
Sub シートの追加()
  Dim myBook As Workbook
  Dim Bookname As String
  Dim I As Long, j As Long
  Dim Shname As String
  With ThisWorkbook.Worksheets("Menu")
    For j = 4 To 10 Step 3
      For I = 5 To 29 Step 2
        If .Cells(I, j).Value <> "" And .Cells(I, j - 1).Value <> "" Then
          Shname = Trim(.Cells(I, j - 1).Value)
          Exit For
        End If
      Next I
    Next j
  End With
  For Each myBook In Workbooks    '開かれたBookのチェック
    If myBook.Name = ThisWorkbook.Name Then
    Else
      Bookname = myBook.Name
      Exit For
    End If
  Next
  MsgBox Workbooks(Bookname).Name
  MsgBox Shname
  MsgBox ThisWorkbook.Name
  Workbooks(Bookname).Worksheets(Shname).Copy After:=ThisWorkbook.Sheets("Menu")
End Sub

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