Excel VBA質問箱 IV

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

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


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

【74075】excel結合時レコードがdeleteされないようにするには にしもり 13/4/16(火) 12:26 質問[未読]
【74076】Re:excel結合時レコードがdeleteされないよ... kanabun 13/4/16(火) 13:01 発言[未読]
【74077】Re:excel結合時レコードがdeleteされないよ... kanabun 13/4/16(火) 13:06 発言[未読]
【74079】Re:excel結合時レコードがdeleteされないよ... にしもり 13/4/16(火) 17:51 お礼[未読]
【74080】Re:excel結合時レコードがdeleteされないよ... kanabun 13/4/17(水) 9:38 発言[未読]
【74081】Re:excel結合時レコードがdeleteされないよ... kanabun 13/4/17(水) 9:52 発言[未読]
【74082】Re:excel結合時レコードがdeleteされないよ... にしもり 13/4/17(水) 10:42 お礼[未読]

【74075】excel結合時レコードがdeleteされないよ...
質問  にしもり  - 13/4/16(火) 12:26 -

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

以下のxlsxを結合するマクロを使おうとしたら、問題が生じました。
たとえばa.xlsxとb.xlsxがあったとしますと、
先に開いたxlsxの最下行をポイントしたまではよかったのですが、その行に
次に開いたxlsxの最上行つまりタイトル行がかぶってpasteされてしまい、その後、タイトル行がdeleteされます。
つまり先に開いたxlsxの最下行のレコードがdeleteされてしまう のです。

この問題を解決するにはどう記述すればよろしいでしょうか。


Sub Test()
Dim Files, FilesCnt As Integer, i As Integer
Dim cBook As Workbook, pBook As Workbook

 Files = Application.GetOpenFilename _
    (FileFilter:="CsVFile(*.xlsx), *.xlsx", MultiSelect:=True)
 If IsArray(Files) Then
   Set pBook = Workbooks.Add(xlWBATWorksheet)
   FilesCnt = UBound(Files)
   For i = 1 To FilesCnt
     Workbooks.Open Files(i)
     Set cBook = ActiveWorkbook

     If i > 1 Then
      cBook.ActiveSheet.UsedRange.Offset(1, 0).Copy
     Else
      cBook.ActiveSheet.UsedRange.Copy
     End If
  
     With pBook.ActiveSheet
      .Cells(.Range("A65536").End(xlUp).Row, 1). _
      PasteSpecial (xlPasteAll)
     End With
     Application.CutCopyMode = False
     cBook.Close
   Next i
 End If

 ActiveWorkbook.SaveAs Filename:="D:\Test.xlsx", FileFormat:= _
 xlOpenXMLWorkbook, CreateBackup:=False

 ActiveWorkbook.Close Filename:="D:\Test.xlsx"
  
  MsgBox "終了しました。"
 
Set cBook = Nothing: Set pBook = Nothing
End Sub

【74076】Re:excel結合時レコードがdeleteされない...
発言  kanabun  - 13/4/16(火) 13:01 -

引用なし
パスワード
   ▼にしもり さん: こんにちは〜

>かぶってpasteされてしまい、

ここかな?
(最終行ではなく その1行下にペースト)

>     With pBook.ActiveSheet
      .Range("A65536").End(xlUp).Offset(1). _
>      PasteSpecial (xlPasteAll)
>     End With

【74077】Re:excel結合時レコードがdeleteされない...
発言  kanabun  - 13/4/16(火) 13:06 -

引用なし
パスワード
   >(最終行ではなく その1行下にペースト)

65536 みたいなマジックナンバー(?)使わないほうが
よかったですね

Cellsを使って表す例

>>     With pBook.ActiveSheet
      .Cells(.Rows.Count, 1).End(xlUp).Offset(1). _
       PasteSpecial xlPasteAll
>>     End With

【74079】Re:excel結合時レコードがdeleteされない...
お礼  にしもり  - 13/4/16(火) 17:51 -

引用なし
パスワード
   ▼kanabun さん:
このようにしたら出来たみたいです。
ありがとうございました。


Sub Test()
Dim Files, FilesCnt As Integer, i As Integer
Dim cBook As Workbook, pBook As Workbook

 Files = Application.GetOpenFilename _
    (FileFilter:="CsVFile(*.xlsx), *.xlsx", MultiSelect:=True)
 If IsArray(Files) Then
   Set pBook = Workbooks.Add(xlWBATWorksheet)
   FilesCnt = UBound(Files)
   For i = 1 To FilesCnt
     Workbooks.Open Files(i)
     Set cBook = ActiveWorkbook

     If i > 1 Then
      cBook.ActiveSheet.UsedRange.Offset(1, 0).Copy
    
      With pBook.ActiveSheet
       .Range("A65536").End(xlUp).Offset(1). _
       PasteSpecial (xlPasteAll)
      End With
    
     Else
      cBook.ActiveSheet.UsedRange.Copy
   
       With pBook.ActiveSheet
  
        .Cells(.Range("A65536").End(xlUp).Row, 1). _
        PasteSpecial (xlPasteAll)
       End With
    
     End If
    
     Application.CutCopyMode = False
     cBook.Close
   Next i
 End If

 ActiveWorkbook.SaveAs Filename:="D:\Test.xlsx", FileFormat:= _
 xlOpenXMLWorkbook, CreateBackup:=False

 ActiveWorkbook.Close Filename:="D:\Test.xlsx"
  
  MsgBox "終了しました。"

Set cBook = Nothing: Set pBook = Nothing
End Sub

【74080】Re:excel結合時レコードがdeleteされない...
発言  kanabun  - 13/4/17(水) 9:38 -

引用なし
パスワード
   ▼にしもり さん:

>このようにしたら出来たみたいです。
>ありがとうございました。

思い通りに位置指定できてコピペできていれば、それでよいのですが、
自分だったら、こう書くというサンプルです

Sub Ck_Test()
 Dim Files, i As Long
 Dim cBook As Workbook, pBook As Workbook
 Dim rCopyTo As Range
 Dim m As Long

  Files = Application.GetOpenFilename _
     (FileFilter:="CsvFile, *.csv", MultiSelect:=True)
  If IsArray(Files) Then
    Set pBook = Workbooks.Add(xlWBATWorksheet)
    
    For i = 1 To UBound(Files)
      Set cBook = Workbooks.Open(Files(i))
      With pBook.Worksheets(1) 'コピー先シート最終セル
        Set rCopyTo = .Cells(.Rows.Count, 1).End(xlUp)
      End With
      m = IIf(i = 1, 0, 1) 'iが1のとき Offsetは無し
      cBook.ActiveSheet.UsedRange.Offset(m).Copy _
       rCopyTo.Offset(m)
      cBook.Close False
    Next i
  End If
 
  pBook.SaveAs Filename:="D:\Test.xlsx", FileFormat:= _
     xlOpenXMLWorkbook, CreateBackup:=False
  pBook.Close True
  
  MsgBox "終了しました。"

End Sub

《修正点》
◆シートの最終行はマジックナンバー65536 を用いないほうがよい _
  Set rCopyTo = .Cells(.Rows.Count, 1).End(xlUp)

◆     Workbooks.Open Files(i)
      Set cBook = ActiveWorkbook
これは
    Set cBook = Workbooks.Open(Files(i))
と一行で 変数にセットできます。(そのまえのpBookも同じ)

◆1つ目とそれ以降で Offset(1)するかしないか 変数mにi=1のとき _
   0, それ以上 1 としておけば、コピー処理は1行で記述できる

◆CopyしてPasteSpecial貼り付け xlPasteAll → Copy と同じ
>      m = IIf(i = 1, 0, 1) 'iが1のとき Offsetは無し
>      cBook.ActiveSheet.UsedRange.Offset(m).Copy _
>         rCopyTo.Offset(m)

◆ActiveWorkbook.Close よりせっかく変数に格納しているのだから _
 pBook.Close としたほうがよい
◆また、pBook.Close の第1引数は SaveChanges ではないか?

【74081】Re:excel結合時レコードがdeleteされない...
発言  kanabun  - 13/4/17(水) 9:52 -

引用なし
パスワード
   あと、もう1点
プロシージャの最後で

>  Set cBook = Nothing

しておられますが、
つけるなら、For〜Nextのなかで、iが変わるごとに Set cBookしている
ので、それの「使用が終了した」とき、つまり
> cBook.Close False
のあとが正しい位置です。

>    For i = 1 To UBound(Files)
>      Set cBook = Workbooks.Open(Files(i))
>      With pBook.Worksheets(1) 'コピー先シート最終セル
>        Set rCopyTo = .Cells(.Rows.Count, 1).End(xlUp)
>      End With
>      m = IIf(i = 1, 0, 1) 'iが1のとき Offsetは無し
>      cBook.ActiveSheet.UsedRange.Offset(m).Copy _
>       rCopyTo.Offset(m)
>      cBook.Close False
       Set cBook = Nothing 'cBookの使用を終了したことを知らせる
>    Next i

ただし、そう書かなくても、i = 2 のとき Set cBook = のところで
これまでの cBookを破棄して あらたに cBookに別のWorkbookを割り当てる
のをVBAが裏で自動でやっていてくれますから、通常は

>     Set cBook = Nothing 'cBookの使用を終了したことを知らせる

は書きません。
pBook についても、プロシージャを終了するときに 自動で破棄されます
から、真面目につけなくてもいいのですが(^^)...
まあ、強いてつけるとしたら、

>  pBook.Close True

の直後、  

>  MsgBox "終了しました。"

の直前でしょうか?


【74082】Re:excel結合時レコードがdeleteされない...
お礼  にしもり  - 13/4/17(水) 10:42 -

引用なし
パスワード
   ▼kanabun さん:
マジックナンバーをなるべく使わないようにとのアドバイスを折角いただいたのに、相変わらず使ってすみません。
また、修正すべき点をここまで丁寧にご説明いただき、誠にありがとうございます。
ゆっくり理解して、知識として実際に使えるよう蓄積に努めたいと思います。
また質問するかもしれませんがその時もよろしくお願いします。

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