Excel VBA質問箱 IV

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

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


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

【82366】外部データが最終行まで読み込まれない。 GAO 24/9/20(金) 9:42 質問[未読]
【82367】Re:外部データが最終行まで読み込まれない。 マナ 24/9/21(土) 19:20 発言[未読]
【82368】Re:外部データが最終行まで読み込まれない。 jindon 24/9/29(日) 12:52 回答[未読]

【82366】外部データが最終行まで読み込まれない。
質問  GAO E-MAIL  - 24/9/20(金) 9:42 -

引用なし
パスワード
   外部のExcelデータを
コピー先のExcelに全コピーします。

コピー元の3行目から最終行までコピーします
コピー先は、A列からZ列にある文字の最後より下に
コピー元のデータを張りつけています。
コードを書いたのですが、コピー元の6行目までしかコピーされず
原因がわからない状態です。
教えて頂けないでしょうか。


Sub ボタン1_Click()
  Dim wsDest As Worksheet
  Dim lastRow As Long
  Dim nextRow As Long
  Dim i As Long, j As Long
  Dim wbSource As Workbook
  Dim wsSource As Worksheet
  Dim filePath As String
  Dim sourceLastRow As Long
  Dim sourceLastCol As Long

  ' ファイルダイアログを使用してファイルを選択
  With Application.FileDialog(msoFileDialogOpen)
    .Title = "Select the Excel file"
    .Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls"
    .AllowMultiSelect = False
    If .Show = -1 Then
      filePath = .SelectedItems(1)
    Else
      MsgBox "ファイルが選択されていません。"
      Exit Sub
    End If
  End With

  ' 外部ファイルを開く
  Set wbSource = Workbooks.Open(filePath)

  ' 1番目のシートを設定
  Set wsSource = wbSource.Sheets(1) ' 1番目のシートを使用

  ' 勘定科目シートの存在を確認
  On Error Resume Next
  Set wsDest = ThisWorkbook.Sheets("勘定科目")
  On Error GoTo 0

  If wsDest Is Nothing Then
    MsgBox "シート '勘定科目' が見つかりません。シート名を確認してください。"
    wbSource.Close False
    Exit Sub
  End If

  ' 勘定科目シートのE列からZ列までの最終行を確認
  lastRow = 0
  For j = 5 To 26 ' E列からZ列まで
    If wsDest.Cells(wsDest.Rows.Count, j).End(xlUp).Row > lastRow Then
      lastRow = wsDest.Cells(wsDest.Rows.Count, j).End(xlUp).Row
    End If
  Next j

  ' 次にデータを入力する行を設定
  If wsDest.Cells(lastRow, 5).Value <> "" Then
    nextRow = lastRow + 1
  Else
    nextRow = lastRow
  End If

  ' 外部ファイルの最終行と最終列を取得
  sourceLastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
  sourceLastCol = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column

  ' データをコピー(3行目から最終行まで、A列からZ列まで)
  For i = 3 To sourceLastRow
    For j = 1 To 26 ' A列からZ列まで
      wsDest.Cells(nextRow, j).Value = wsSource.Cells(i, j).Value
    Next j
    nextRow = nextRow + 1
  Next i

  ' 外部ファイルを閉じる
  wbSource.Close False

  MsgBox "データのコピーが完了しました。"
End Sub

【82367】Re:外部データが最終行まで読み込まれな...
発言  マナ  - 24/9/21(土) 19:20 -

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

sourceLastRow は、A列最終行なのに
lastRow は、E〜Z列の最終行ですが何故ですか

【82368】Re:外部データが最終行まで読み込まれな...
回答  jindon  - 24/9/29(日) 12:52 -

引用なし
パスワード
   ADO接続で読み込み

Sub ボタン1_Click()
  Dim wsDest As Worksheet
  Dim lastRow As Long
  Dim filePath As String

  ' ファイルダイアログを使用してファイルを選択
  With Application.FileDialog(msoFileDialogOpen)
    .Title = "Select the Excel file"
    .Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls"
    .AllowMultiSelect = False
    If .Show = -1 Then
      filePath = .SelectedItems(1)
    Else
      MsgBox "ファイルが選択されていません。"
      Exit Sub
    End If
  End With
  
  ' 勘定科目シートの存在を確認
  On Error Resume Next
  Set wsDest = ThisWorkbook.Sheets("勘定科目")
  On Error GoTo 0
  
  If wsDest Is Nothing Then
    MsgBox "シート '勘定科目' が見つかりません。シート名を確認してください。"
    Exit Sub
  End If
  '勘定科目シートのA:Z列の最終行を取得
  With Intersect(wsDest.UsedRange, wsDest.Columns("a:z"))
    lastRow = wsDest.Evaluate("max(if(" & .Address & "<>"""",row(" & .Address & ")))")
  End With
  
  ' 外部ファイルのシート名を取得する
  Dim wsName$
  With CreateObject("DAO.DBEngine.120").workspaces(0).OpenDatabase(filePath, True, True, "excel 12.0;HDR=No;")
    wsName = Replace(.tabledefs(0).Name, "'", "")
    wsName = Left$(wsName, Len(wsName) - 1)
    .Close
  End With
  
  ' 外部ファイルをDatabaseとして接続する
  Dim s$
  s = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & filePath & _
      ";Extended Properties='Excel 12.0;HDR=No';"
  With CreateObject("ADODB.Recordset")
    .Open "Select * From `" & wsName & "$A3:Z`", s
    wsDest.Cells(lastRow + 1, 1).CopyFromRecordset .DataSource
  End With

  MsgBox "データのコピーが完了しました。"
End Sub

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