• 締切済み

マクロ CSVファイル取込 最終行、最終列の取得

マクロでCSVファイルを取込むプログラムを作成しております。 最終行を取得するソースまではできたのですが、最終列を取得する処理ができておりません。 教えて頂けないでしょうか。 処理概要 (1)ボタンを押したら、Sheet2にCSVファイルがインポートされる (2)Sheet2に出力されたA2行~A8行とA2行~A8行の最終列までをSheet1のD4行~D10行、D4行~D10行の列にコピー  (3)Sheet2に出力されたA9行目はコピーしない (4)Sheet2に出力されたA10行以降とA10行以降の最終列までをSheet1のA13行以降の最終列までにコピー 現在のソースは(2)、(4)の最終列を取得するソース以外はできています。 (2)、(4)の最終列を取得し、コピーする方法を教えて下さい。 現在のソースです。 Sub READ_TextFile() Dim LoadFileName As String Dim LR As Long '選んだcsvファイルをSheet1に読み込む LoadFileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", 1, "読み込むcsvファイルを選んで下さい", False) If LoadFileName = "False" Then Exit Sub Workbooks.Open LoadFileName Cells.Copy ThisWorkbook.Sheets("Sheet2").Range("A1") ActiveWorkbook.Close False 'Sheet2のA2:A8をSheet1のD4を先頭セルとする範囲にCopy Worksheets("Sheet2").Range("A2:A8").Copy Worksheets("Sheet1").Range("D4") 'Sheet2のA列のデータのある最終行を取得しLRという変数に入れる LR = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 'Sheet2のA10からA列の最終行までをSheet1のA13を先頭セルとする範囲にCopy Worksheets("Sheet2").Range("A10:A" & LR).Copy Worksheets("Sheet1").Range("A13") End Sub

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

2:8行の最終セルと10行以降の最終セルをきっちりと分けて判定する必要がある場合は Sub test()   Dim r As Range   Dim rr As Range   With Worksheets("Sheet2")     Set r = .Rows("2:8").Cells     '2:8行間の最終列のセルを取得     Set r = r.Find(What:="*", _             After:=r(1), _             LookIn:=xlFormulas, _             LookAt:=xlPart, _             SearchOrder:=xlByColumns, _             SearchDirection:=xlPrevious, _             MatchByte:=False)     If Not r Is Nothing Then       If r.Column >= .Columns.Count - 3 Then         MsgBox "error"       Else         Set r = .Range("A2:A8").Resize(, r.Column)         MsgBox r.Address       End If     End If     '10行以降のデータ範囲を取得     Set r = Intersect(.Rows("10:" & .Rows.Count), .UsedRange)     If Not r Is Nothing Then       '念のためA10起点でSetし直し       Set r = .Range("A10", r.Cells(r.Count))       '10行以降のデータ範囲内の最終列のセルを取得       Set rr = r.Find(What:="*", _               After:=r(1), _               LookIn:=xlFormulas, _               LookAt:=xlPart, _               SearchOrder:=xlByColumns, _               SearchDirection:=xlPrevious, _               MatchByte:=False)       Set r = r.Columns(1).Resize(, rr.Column)       MsgBox r.Address     End If   End With End Sub ..こんな感じになりますが アバウトで構わなければ Sub test2()   Dim r As Range   With Worksheets("Sheet2")     Set r = .UsedRange.SpecialCells(xlCellTypeLastCell)     MsgBox .Range("A2:A8").Resize(, r.Column).Address     If r.Row > 9 Then       MsgBox .Range("A10", r).Address     End If   End With End Sub ..これで良い場合もあります。

関連するQ&A

  • VBScript エクセル 最終行と最終列取得

    今、たくさんのシートがある、エクセルのファイルがあり、「C6」以降が縦の項目行、「D5」以降が横の項目列です。 項目行と項目列には、間に空白のセルは存在しません。 この状態で、項目行、項目列の最終の場所を取得しなければなりません。 そこで、「r = Range("C6").End(-4121).Row」(「-4121」は「xlDown」)、「c = Range("D5").End(-4161).Column」(「-4161」は「xlToRight」)で次々に求めていったのですが、「C6」に縦の項目が1つだけ、「D5」に横の項目が1つだけ、というシートがありました。 すると、そのシートでは、「r」と「c」の値は、エクセルそのものの最大の行数と最大の列数が返ってきてしまいました。 そこで、「D6」にのみ、文字があるサンプルファイルを作り、そのサンプルファイルに対して、「r = Range("D5").End(-4121).Row」と「c = Range("C6").End(-4161).Column)」で求めると、ちゃんと、「r = 6」、「c = 4」という値が返ってきたので、「r」の場合は、1つ上から、「c」については、1つ左から「Range」を設定すればいい、と思って、実際のデータで試すと、他のシートでは、全然うまくゆきません。 結果的に、問題は、「If」文で、ムリヤリ解決させたのですが、「If」文の場合ですと、前もって全シートを確認して、調べておかなければなりません。 何とか、汎用的に項目が1つしかない場合も、その項目のある「行」と「列」が最終行、最終列として取得できる方法はないでしょうか? ただし、項目が「0個」ということはありませんので、そこまで考えて頂く必要はありません。 「VBA」でも結構ですので、よろしくお願いいたします。

  • シート1のC列の最終行をコピーして同じ行に値貼り付けしたい

    シート1のC列の最終行を取得して その行を丸々値貼り付けするマクロを作りたいと思います。 シート3のB18の値をシート1のC列の最終行の1つ下のセルに値貼り付け すると、その行のA、B列に日付が入力される関数が入っています。(下まで) 関数が入ったままだと、うまくいかない時があるので最終行をコピーして値貼り付けしたいのですが、マクロの作り方を教えてください。 シート1の最終行に貼り付け Sheets("Sheet3").Select Range("B18").Select Selection.Copy Sheets("Sheet1").Select Range("C65536").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 最終行をコピーして値貼り付け Dim 最終行 As Integer 最終行 = Range("C65536").End(xlUp).Row Range("A6:C" & 最終行).Select Selection.Copy Sheets("Sheet1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub このマクロだと、A6からC列の最終行まで全てコピーされてしまうので、C列の最終行のAからC列まで1行だけコピーできないでしょうか?

  • マクロを使った文字化けしないCSV取込について

    マクロを使って、csvをインポートしたいです。 しかし、csvを取り込むと、対象列が日付になってしまいます。 元データcsvには、とある一列の行毎に、0-3 10-1 22-5 0-1-2、11-14-0 などの数字と記号が並んでいます。 下記に意図したコードを入れたのですが、csvが変換されて、2022/1/3だとか、2011/1/14などとなります。 これを元のデータの通りに取り込むには、どのようなコードを差し込めば良いのでしょうか? ※設定(adodb.stream)は行わない想定です。 ご教示願います。 "Sub Csv_Import() Dim A_Sheet 'Excelファイルのシート名を入れ込む変数' Dim Csv_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数' A_Sheet = ActiveSheet.Name '現在アクティブなシート名を変数 A_Sheet に入れ込む' Csv_Import_File = Application.GetOpenFilename(""CSVファイル,*.csv"") 'CSVファイルを選択する' If Csv_Import_File = ""False"" Then Exit Sub 'キャンセルなら終了' ThisWorkbook.Sheets(""Import"").Range(""A1:OOO2000"").ClearContents '「CSVデータ取込み」シートのセル「A1~OOO2000」をクリアする' With Workbooks.Open(Csv_Import_File) .Sheets(1).Cells.Copy ThisWorkbook.Sheets(""Import"").Range(""A1"") '全てのデータをこのブックの「CSVデータ取込み」シートにコピー' .Close 'CSVファイルを閉じる' End With Worksheets(A_Sheet).Activate 'A_Sheet という名前のシートをアクティブにする' End Sub

  • CSVファイルの取り込みについて

    CSV取り込み方法について 教えていただきたくお願いいたします。 エクセルのマクロ・VBAの組み方について デスクトップ上の000という名前のCSVファイルを、作業しているエクセルファイルのLoadという名前のシートに貼り付けたいと思っています。 CSVファイルはエクセルで開くと1行に11列の項目が展開されています。 貼り付ける項目はこのようになります。 (CSV) →(エクセルのLoadシート) 1列目(A行)→B行へ 2列目   →C行へ 3列目   →D行へ 4列目   →E行へ 5列目   →F行へ 9列目   →G行へ 10列目  →H行へ 11列目  →I行へ (6.7.8列目は使いません) 最後にLoadのシートのA行に”=B&E”とい式を入力したいと思っています。 まだ初心者なので勉強中なのですが、仕事上急遽必要になりましたのでお願いいたします。

  • マクロCSV出力

    Sheet1に入力されている値をCSVファイルに出力したいと思っております。 但し、特定のセルだけを取得して、1つのファイルに出力したいと思っています。 (1)D2~G2に入力されている値を取得 (2)E4~E10までと、E4~E10の最終列までの値を取得 (3)B11の値を取得 (4)A13~A列の最終行まで、A13~A列の最終行の最終列までの値を取得 (1)、(2)、(3)、(4)の値を取得して、1つのCSVファイルに出力するプログラムを作成したいと思っております。 (1)は1行目に出力 (2)は2行目~8行目に出力 (3)は9行目に出力 (4)は10行目以降に出力 出力の形式は ”TEST”,” ”,”SMP”のようにダブルクォーテーションで値を囲って出力したいと思っています。 値が入っていないセルは” ”,としたいと思っております。 サンプルを作成して頂けないでしょうか。

  • CSVファイルの最終行のデータを取り出したい

    PHPでCSVファイルのデータを取り込もうとしています。 全てのデータを表示させるのであれば、「while」などを使って書くのが一般的かと思うのですが、 最終行のデータ(「,」で区切られた最も左のフィールド)だけを取り出したいので、 以下のように書いてみました。 <?php $file = fopen("hoge.csv","a+"); $nakami = fgetcsv ($file, 1000, ","); echo $nakami[0]; fclose($file); ?> 「fopen」のmodeについて、「r」にすれば先頭から読み込まれ、 「a+」もしくは「ab+」ならばファイルの終わりにポインタが来る・・・ と色々なマニュアルに書かれていましたので、上記のようにしてみたのですが、 $nakami[0]で表示されるのは、1行目の最左列のデータになってしまいます。 1)このやり方(modeの設定)では最終行のデータ取得は不可能なのか 2)どのようなやり方なら最終行のデータ(のみ)は取得できるのか お知恵をお借りできれば幸いです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 何列の何行目が最終行なのか取得するコードはありますでしょうか?

      A列  B列  C列 1  ○   ○ 2        ○ 3               ○ これは最終行が3行目と言うのがぱっと見でわかりますが もっと列も行も多い場合、 シート内の何列の何行目が最終行なのか取得するコードはありますでしょうか? Cells(65536, ?).End(xlUp).Row を行ないたいのですが 毎回何列の行が一番下かを取得する方法があれば教えてください。 よろしくお願い致します。

  • ExcelVBAを使用したCSVファイルのデータの取込みについて

    いろんなサイトの情報を見ながら作っていたのですがどうもうまくいかないのでアドバイスなど頂きたいです。 書き方もおかしいと思うのでこう記述するべきとかあったら教えてほしいです。 <やりたいこと> ダイアログボックスより取り込みたいcsvを選択 選択したファイルのパスを一度テキストボックスに書きだす。 新規シートを作成してシート名を変更して 先ほどテキストボックスに書きだした情報を元に CSVファイルのデータを新規作成したシートにコピーを張り付ける 呼び出したCSVファイルを閉じる といったようにしたいのです。 できたら欲しい情報の入った列だけとりだしたかったのですが・・・。 現状記述してあるのは下記になります。 これだととりあえずコピーできてるみたいですが、呼び出したCSVファイルが閉じないのです。 Private Sub CommandButton1_Click() Dim OpenFileName As Variant OpenFileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv") TextBox1.Value = OpenFileName End Sub Private Sub CommandButton2_Click() Worksheets.Add After:=Worksheets("Sheet1"), Count:=1 ActiveSheet.Name = "テスト" Workbooks.Open Filename:=TextBox1 ActiveSheet.Cells.Copy Destination:=ThisWorkbook.Sheets("テスト").Range("A1") Workbooks(TextBox1).Close End Sub

  • 最終行を取得して、別の列にコピーするマクロ

    最終行を取得して、別の列にコピーするVBAマクロを教えてください。 (Excel2003です) 具体的には、次の通りです。 (1)A2から下方に項目NOが入っています。可変です。  A2から項目NOの最終行までの行数をカウントします。 (2)B3:D3には数式が入っています。  B4:D4以下に数式を(1)で取得した行数分だけコピーします。 かなり緊急で困っています。 教えていただけると助かります。

  • Excel2007 VBA 最終行の特定セルの取得

    ●質問の主旨 A列の入力を欠いた最終行の特定セルの取得及び転記について ご教示ください。 ●質問の詳細 下記の要領で現金出納帳を作成しています。 1. 項目は以下の通りです。  A     B     C      D   E        F 日付 摘要1 摘要2 収入金額  支出金額 残高金額 2. 下の行に向かって1.の具体的内容を入力していきます。 3. 同じ日に複数の項目がある場合、その日の先頭項目のみA列に 日付を入力し、2番目の項目には、日付を入力しない。 4. 当月の一番最後に入力されている項目のF列の残高金額をもって、 次月の残高(繰越残高)とする 5. 当月の残高(繰越残高)は、雛型シートを用意し、 そのシートのF3セルに入力する。 ※ 一日に必ず複数の項目を入力するため、最終行には 日付の入力を欠いていることがほとんどです。私案のコードでは 「最終日」の1番目の残高は拾えても、「最終日」の最終行を 拾うことができません。コードをどのように書き換えたらよろしい でしょうか? ●私案のコード Sub 繰越_Click() Dim i As Integer '既存のシート数を取得 i = ThisWorkbook.Worksheets.Count '最終シートをコピーして後ろに挿入 Worksheets(i).Copy after:=Worksheets(i) '月リストからシート名を取得してシート名変更 Worksheets(i + 1).Name = Sheets("月リスト").Cells(i + 1, 1).Value '新しく作成したワークシートについて以下の処理を行う With ActiveWorksheets '当月の残高を次月に繰り越す (残高が記入されている最終行,F列の値を次月シートのF3セルに代入する) Range("F3") = Worksheets(i).Range("A1045876").End(xlUp).Offset(0, 5).Value End With End Sub 使用機種はWindouws Vista Excel2007です。当方はVBA初心者です。   

専門家に質問してみよう