Excel VBA質問箱 IV

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

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


9 / 3840 ページ ←次へ | 前へ→

【82304】Re:テーブル最終行にデータ貼り付け
発言  マナ  - 24/6/5(水) 14:51 -

引用なし
パスワード
   ▼なんでやねん さん:

> 他にどのような原因が考えられるでしょうか?

コピーと行追加の順番を入れ替えてください。
(でないと、コピーモードが解除される)
・ツリー全体表示

【82303】Re:テーブル最終行にデータ貼り付け
質問  なんでやねん  - 24/6/5(水) 11:47 -

引用なし
パスワード
   マナさん
 targetTable.ListRows.Add.Range(1, 2).PasteSpecial Paste:=xlPasteValues を
 newRow.Range(1, 2).PasteSpecial Paste:=xlPasteValues に置換しました。
 やはり同じエラーが発生します。
 "実行時エラー1004 Rangeクラスの PaseSpecialメソッドが失敗しました。"

 試しにコピー範囲を
 Range("A2:KC2")からRange("A2:C2")に変更してみましたが結果は同じでした。

他にどのような原因が考えられるでしょうか?
・ツリー全体表示

【82302】Re:テーブル最終行にデータ貼り付け
発言  マナ  - 24/6/5(水) 11:17 -

引用なし
パスワード
   ▼なんでやねん さん:

newRow.Range(1, 2).PasteSpecial Paste:=xlPasteValues
・ツリー全体表示

【82301】テーブル最終行にデータ貼り付け
質問  なんでやねん  - 24/6/4(火) 14:43 -

引用なし
パスワード
   エラーが出る原因をご教示ください。
(希望する動作)リストボックスに登録された複数フォルダ内のcsvファイルから順次、データをコピーしテーブルの最下行にペーストを行う。
(エラー)targetTable.ListRows.Add.Range(1, 2).PasteSpecial Paste:=xlPasteValues で "実行時エラー1004 Rangeクラスの PaseSpecialメソッドが失敗しました。"

Sub CB登録開始_Click()

  Dim folderPath As String
  Dim csvWorkbook As Workbook
  Dim dbWorkbook As Workbook
  Dim targetTable As ListObject
  Dim newRow As ListRow
  Dim i As Long

  ' このVBAが記されたファイルを参照
  Set dbWorkbook = ThisWorkbook
  Set targetTable = dbWorkbook.Sheets("分析db").ListObjects("概要table")
  
  ' リストボックスに登録された各フォルダを処理
  For i = 0 To UFフォルダ選択.LB.ListCount - 1
    folderPath = UFフォルダ選択.LB.List(i)

    ' フォルダ内の"分析.csv"ファイルを開く
    Set csvWorkbook = Workbooks.Open(folderPath & "\分析.csv")

    ' "A2:KC2"の範囲をコピー
    csvWorkbook.Sheets(1).Range("A2:KC2").Copy

    ' 新しい行を追加し、ペースト
    Set newRow = targetTable.ListRows.Add
    
    ' B列にペースト
    targetTable.ListRows.Add.Range(1, 2).PasteSpecial Paste:=xlPasteValues

    ' クリップボードをクリア
    Application.CutCopyMode = False

    ' "分析.csv"ファイルを閉じる
    csvWorkbook.Close SaveChanges:=False
  Next i

  MsgBox "処理が完了しました。"

End Sub
・ツリー全体表示

【82300】Re:セルの改行が影響してエクセルへの抽...
お礼  VBA初学者です_T  - 24/6/3(月) 10:44 -

引用なし
パスワード
   ▼マナ 様:
>▼VBA初学者です_T さん:
>
>【セル内改行 ダブルクォーテーション対応】ExcelVBAのCSV読み込み方法7つ
>ht ht tps://kamocyc.hatenablog.com/entry/2019/12/12/071856

マナ様
ありがとうございました!
様々試してみたところ、解決しました!
・ツリー全体表示

【82299】Re:セルの改行が影響してエクセルへの抽...
発言  マナ  - 24/5/30(木) 21:04 -

引用なし
パスワード
   ▼VBA初学者です_T さん:

【セル内改行 ダブルクォーテーション対応】ExcelVBAのCSV読み込み方法7つ
ht ht tps://kamocyc.hatenablog.com/entry/2019/12/12/071856
・ツリー全体表示

【82298】セルの改行が影響してエクセルへの抽出結...
質問  VBA初学者です_T  - 24/5/29(水) 15:41 -

引用なし
パスワード
   先日、こちらにてお世話になりました。
表題の件、
csvファイルからエクセルシートへのデータ取得の際、セルの中に改行がある場合、一行に表示されるはずのデータが下のセルへ下のセルへ縦にデータが抽出されます。

どのように記述すれば解決するか、教えていただける方、いらっしゃいませんか?
宜しくお願い致します。


Sub C列でフィルター且つ列番号でデータ取得CSV()
  Dim ws As Worksheet
  Dim wsNew As Worksheet
  Dim csvFile As String
  Dim lastRow As Long
  Dim i As Long
  Dim newRow As Long
  Dim today As String
  Dim cValue As String
  Dim filterValues As Variant
  Dim columnsToCopy As Variant
  Dim colIndex As Long
  Dim copyColumn As Long
  
    ' フィルター対象の値を設定
  filterValues = Array("5", "11", "82", "402", "413", "421", "579", "580", "620")
  
    ' 転記する列を設定
  columnsToCopy = Array(1, 3, 4, 8, 21, 37, 56, 45, 48, 58, 62, 68, 70, 71, 73, 76, 84, 87, 20, 53)

  ' 今日の日付を取得してフォーマット
  today = Format(Date, "yyyymmdd")

  ' CSVファイルのパスを指定
  csvFile = Application.GetOpenFilename("CSVファイル (*.csv), *.csv")
  If csvFile = "False" Then Exit Sub ' ユーザーがキャンセルした場合

  ' 新しいワークシートを作成
  Set wsNew = ThisWorkbook.Sheets.Add
  wsNew.Name = "臨時進捗表_" & today

  ' CSVファイルを読み込むための一時的なワークシートを作成
  Set ws = ThisWorkbook.Sheets.Add
  ws.Name = "TempCSVData"

  ' CSVファイルを読み込み
  With ws.QueryTables.Add(Connection:="TEXT;" & csvFile, Destination:=ws.Range("A1"))
    .TextFileParseType = xlDelimited
    .TextFileCommaDelimiter = True
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) ' 必要に応じて列数を変更
    .Refresh BackgroundQuery:=False
  End With

  ' データの最終行を取得
  lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

  ' ヘッダーのコピー
  For i = LBound(columnsToCopy) To UBound(columnsToCopy)
    wsNew.Cells(1, i + 1).Value = ws.Cells(1, columnsToCopy(i)).Value
  Next i

  newRow = 2

  ' C列に指定された文字列が含まれる行を検索して指定の列を転記
  For i = 2 To lastRow ' ヘッダー行を飛ばして2行目から開始
    cValue = ws.Cells(i, 3).Value
    If Not IsError(Application.Match(cValue, filterValues, 0)) Then
      For colIndex = LBound(columnsToCopy) To UBound(columnsToCopy)
        copyColumn = columnsToCopy(colIndex)
        wsNew.Cells(newRow, colIndex + 1).Value = ws.Cells(i, copyColumn).Value
      Next colIndex
      newRow = newRow + 1
    End If
  Next i

  ' 一時的なワークシートを削除
  Application.DisplayAlerts = False
  ws.Delete
  Application.DisplayAlerts = True

  MsgBox "列番号でのデータ抽出が完了しました!", vbInformation
End Sub
・ツリー全体表示

【82297】Re:A-Z列は転記されるが、AB列以降の取得...
お礼  VBA初学者です_T  - 24/5/25(土) 17:45 -

引用なし
パスワード
   ▼マナ 様:
>▼VBA初学者です_T さん:
>
>「フォルダから」で、データを取得すとよいです。


マナ様
ヒント、ありがとうございます!
「フォルダから」で取得してみます!
・ツリー全体表示

【82296】Re:A-Z列は転記されるが、AB列以降の取得...
発言  マナ  - 24/5/25(土) 12:54 -

引用なし
パスワード
   ▼VBA初学者です_T さん:

「フォルダから」で、データを取得すとよいです。
・ツリー全体表示

【82295】Re:A-Z列は転記されるが、AB列以降の取得...
発言  VBA初学者です_T  - 24/5/24(金) 19:30 -

引用なし
パスワード
   ▼マナ 様:
>▼VBA初学者です_T さん:
>
>そういうことであれば、マクロを使わずに、
>抽出も含めPower Queryで実行ではだめですか。


マナ様

Power Query での実行も検討中です。
実務では毎日、csvファイル名(主に日付)が変わるので、読み込むファイル名が統一でなくても良いのか、(今のところは同じファイル名じゃないと運用できないのかなと、、)
毎回、同じファイル名にしないとPower Query更新されないか、毎日の運用でどちらがいいのか、検討しています。

今回のマクロ、Power Query共に毎日、データを取得して毎日エクセルデータを整理して活用している方々の運用にどちらを取り入れるべきか、作成と検討を行い、ご提案しようと考えています。

何度もレス頂きありがとうございます。
・ツリー全体表示

【82294】Re:A-Z列は転記されるが、AB列以降の取得...
発言  マナ  - 24/5/24(金) 12:49 -

引用なし
パスワード
   ▼VBA初学者です_T さん:

そういうことであれば、マクロを使わずに、
抽出も含めPower Queryで実行ではだめですか。
・ツリー全体表示

【82293】Re:A-Z列は転記されるが、AB列以降の取得...
質問  VBA初学者です_T  - 24/5/23(木) 8:05 -

引用なし
パスワード
   ▼マナ 様:
>▼VBA初学者です_T さん:
>
>> CSVファイルのデータをエクセルに落とし、
>
>これは、どのような操作ですか。

マナ様

Excelの操作で言うと、
データ → データの取得(Power Query) →テキスト/CSV シートに全データの読み込み

の操作です。
同ブック内のシート間で必要な行と列の転記をVBAで指示した所、転記ができましたので、
問題はVBAでのCSVの読み込み指示かと思いましたがいかがでしょうか。
・ツリー全体表示

【82292】Re:CSV出力について
発言  マナ  - 24/5/22(水) 20:30 -

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

Sub test()
  Open "D:\test.csv" For Output As #1
  Print #1, Range("A1").Value & "," & Range("A2").Value
  Print #1, Range("C3").Value & "," & Range("C5").Value
  Close #1
End Sub
・ツリー全体表示

【82291】CSV出力について
質問  てんてん  - 24/5/22(水) 16:08 -

引用なし
パスワード
   例えば
A1 に AAA  A2 に BBB
C3 に CCC  C5 に DDD

といったエクセルの表を、CSVに2行出力するVBAのコードを教えてもたうと助かります。
よろしくお願いいたします。
・ツリー全体表示

【82290】Re:A-Z列は転記されるが、AB列以降の取得...
発言  マナ  - 24/5/22(水) 13:58 -

引用なし
パスワード
   ▼VBA初学者です_T さん:

> CSVファイルのデータをエクセルに落とし、

これは、どのような操作ですか。
・ツリー全体表示

【82289】Re:A-Z列は転記されるが、AB列以降の取得...
質問  VBA初学者です_T  - 24/5/21(火) 15:57 -

引用なし
パスワード
   ▼マナ 様: 
>▼VBA初学者です_T さん:
>
>
>>抽出された横列がA-Zまでは抽出できていますが、AB列以降が抽出できない状況です。
>
>
>問題なのでは、どちらですか?
>1)CSVデータのTempシートへの読み込み
>2)Tempシートからの転記
>
>ステップ実行で、どの行で想定外の挙動となるのか確認してください。

マナ様
書き込みありがとうございます!
ステップインでの確認、初めて行いました。

一行ずつ、確認した結果、
>1)CSVデータのTempシートへの読み込み が問題でした。

どのような規則で並んだのか直ぐに理解できない状況ですが、
A列にほとんどの文字列が羅列されておりました。

なるほど!と思い、CSVファイルのデータをエクセルに落とし、
別のモジュールを記載して、ブック内でデータの読み込みと同条件の転記を実行したところ、
全ての列の情報が転記できました。

CSVの読み込み指示が誤っていると言う事でしょうか。

何度もお応え頂き恐縮ですが、ご教授お願い致します。
・ツリー全体表示

【82288】Re:A-Z列は転記されるが、AB列以降の取得...
発言  マナ  - 24/5/21(火) 13:49 -

引用なし
パスワード
   ▼VBA初学者です_T さん:


>抽出された横列がA-Zまでは抽出できていますが、AB列以降が抽出できない状況です。


問題なのでは、どちらですか?
1)CSVデータのTempシートへの読み込み
2)Tempシートからの転記

ステップ実行で、どの行で想定外の挙動となるのか確認してください。
・ツリー全体表示

【82287】A-Z列は転記されるが、AB列以降の取得が...
質問  VBA初学者です_T  - 24/5/20(月) 13:57 -

引用なし
パスワード
   VBA初学者です。

CSVを読み込み、C列の中でフィルターをかけ、フィルターで抽出された行、且つ、指定の列を転記したいと思っています。
書籍を2冊読み、YouTubeなどで学び、chat GPTやcopilotなどで何とか、VBAを実行したいとトライしておりますが、うまくいきません。

c列の中でのフィルターは抽出できました。
抽出された横列がA-Zまでは抽出できていますが、AB列以降が抽出できない状況です。
列の抽出のコードの書き方が間違っているのでしょうか。

どなたかご教授ください。
宜しくお願い致します。


Sub C列でフィルター且つ列番号でデータ取得CSV()
  Dim ws As Worksheet
  Dim wsNew As Worksheet
  Dim csvFile As String
  Dim lastRow As Long
  Dim i As Long
  Dim newRow As Long
  Dim today As String
  Dim cValue As String
  Dim filterValues As Variant
  Dim columnsToCopy As Variant
  Dim colIndex As Long
  Dim copyColumn As Long
  
    ' フィルター対象の値を設定
  filterValues = Array("5", "11", "82", "402", "413", "421", "579", "580", "620")
  
    ' 転記する列を設定
  columnsToCopy = Array(1, 3, 4, 8, 21, 37, 56, 45, 48, 58, 62, 68, 70, 71, 73, 76, 84, 87, 20, 53)

  ' 今日の日付を取得してフォーマット
  today = Format(Date, "yyyymmdd")

  ' CSVファイルのパスを指定
  csvFile = Application.GetOpenFilename("CSVファイル (*.csv), *.csv")
  If csvFile = "False" Then Exit Sub ' ユーザーがキャンセルした場合

  ' 新しいワークシートを作成
  Set wsNew = ThisWorkbook.Sheets.Add
  wsNew.Name = "臨時進捗表_" & today

  ' CSVファイルを読み込むための一時的なワークシートを作成
  Set ws = ThisWorkbook.Sheets.Add
  ws.Name = "TempCSVData"

  ' CSVファイルを読み込み
  With ws.QueryTables.Add(Connection:="TEXT;" & csvFile, Destination:=ws.Range("A1"))
    .TextFileParseType = xlDelimited
    .TextFileCommaDelimiter = True
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) ' 必要に応じて列数を変更
    .Refresh BackgroundQuery:=False
  End With

  ' データの最終行を取得
  lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

  ' ヘッダーのコピー
  For i = LBound(columnsToCopy) To UBound(columnsToCopy)
    wsNew.Cells(1, i + 1).Value = ws.Cells(1, columnsToCopy(i)).Value
  Next i

  newRow = 2

  ' C列に指定された文字列が含まれる行を検索して指定の列を転記
  For i = 2 To lastRow ' ヘッダー行を飛ばして2行目から開始
    cValue = ws.Cells(i, 3).Value
    If Not IsError(Application.Match(cValue, filterValues, 0)) Then
      For colIndex = LBound(columnsToCopy) To UBound(columnsToCopy)
        copyColumn = columnsToCopy(colIndex)
        wsNew.Cells(newRow, colIndex + 1).Value = ws.Cells(i, copyColumn).Value
      Next colIndex
      newRow = newRow + 1
    End If
  Next i

  ' 一時的なワークシートを削除
  Application.DisplayAlerts = False
  ws.Delete
  Application.DisplayAlerts = True

  MsgBox "列番号でのデータ抽出が完了しました!", vbInformation
End Sub
・ツリー全体表示

【82286】Re:検索できるドロップダウン
お礼  名無し  - 24/5/10(金) 12:13 -

引用なし
パスワード
   ▼マナ 様:
レスありがとうございます。
無事動かすことができました。
大変助かりました。
・ツリー全体表示

【82285】Re:検索できるドロップダウン
発言  マナ  - 24/5/9(木) 22:15 -

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

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range, c As Range
  Dim w, v
  
  Set r = Intersect(Target, Columns(3))
  If r Is Nothing Then Exit Sub
 
  With Worksheets("従業員名簿")
    w = Application.Transpose(.Range("C2", .Cells(Rows.Count, 3).End(xlUp)))
  End With
  
  r.Validation.Delete
 
  For Each c In r
    If c.Row > 2 Then
      If c.Value <> "" Then
        v = Filter(w, c.Value)
        Application.EnableEvents = False
        If UBound(v) = -1 Then
          c.ClearContents
        ElseIf UBound(v) = 0 Then
          c.Value = v
        Else
          c.Validation.Add Type:=xlValidateList, Formula1:=Join(v, ",")
        End If
        Application.EnableEvents = True
      End If
    End If
  Next

End Sub
・ツリー全体表示

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