• ベストアンサー

VBAで行数を数えてテキストデータにコピーしたい。

エクセルの実行ボタンを押すとアクティブシートにあるデータのA7から空白までの行数を数えて、その行数と同じ分、テキストデータをSQLテキストファイルにコピーしたいのですが、うまくいきません。 どなたか分かる方教えてください。 出来れば、下記のVBAを生かして組み込みたいです。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim myDate As String Dim myPath As String Dim NewPath As String Dim FNo As Integer Dim Ar(1) As String Dim SqlData As String Dim i As Integer Dim j As Integer '★配列にsqlファイルのタイトルを代入★ Ar(0) = "TEST1.sql" Ar(1) = "TEST2.Sql" '★sqlデータの内容を入れる★ sqlData0 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_a" & Chr(13) & Chr(10) SqlData1 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_b" & Chr(13) & Chr(10) & "testdata_c" myDate = Format(Date, "yyyymmdd") myPath = ThisWorkbook.Path NewPath = myPath & "\" & myDate ↑VBAは省略して途中まで記載しました。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 >エクセルの実行ボタンを押すと >アクティブシートにあるデータのA7から空白までの行数を数えて、その行数と同じ分、 >テキストデータをSQLテキストファイルにコピーしたい 元のご質問のURLは出しておいたほうが良いかなって思います。書いた本人(私)が、常に、フィードバックできるとは限りませんので。 >sqlData0 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_a" & Chr(13) & Chr(10) コマンドボタンで、ActiveSheet ということもないなって思いますね。ボタンを押してからシートを選択するなら別ですが。 #1 さんの「具体的にこういう結果になって欲しいのだが、結果はこうなるみたいなモノがあるならそちらをあげられた方がよいかと。」それは、同感です。 今回は、結果が見えていないので、はっきりしたことは言えませんが、 SqlData1 側は、 "testdata_b" & Chr(13) & Chr(10) & "testdata_c" とすると、 testdata_b testdata_ctestdata_b testdata_ctestdata_b  ・  ・  ・ ということになるので、全体のバランスとしてなんとなく変なので、その後に改行コードを入れました。 '-------------------------------------------------------- Sub MakeFolderDateR()  Dim myDate As String  Dim myPath As String  Dim NewPath As String  Dim FNo As Integer  Dim Ar(1) As String  Dim i As Integer  '新たに加えた    Dim SqlData(1) As String '配列  Dim cnt As Integer 'A7 以降の数を数える  Dim j As Integer  Dim buf As String      '配列に入れる  Ar(0) = "test1.sql"  Ar(1) = "test2.sql"  'データ  SqlData(0) = "testdata_a" & Chr(13) & Chr(10)  SqlData(1) = "testdata_b" & Chr(13) & Chr(10) & "testdata_c" & Chr(13) & Chr(10)  '※SqlData(1)側は修正を加えました。    'アクティブシートにあるデータのA7から空白までの行数を数えて、その行数と同じ分、  With ActiveSheet '←コマンドボタンの場合はActiveSheetは必要ないはず     cnt = .Range("A7", .Range("A7").End(xlDown)).Rows.Count  End With  If cnt = 0 Then MsgBox "ワークシートを確認してください。", vbInformation: Exit Sub  For i = 0 To UBound(SqlData())   For j = 1 To cnt    buf = buf & SqlData(i)   Next j   SqlData(i) = Mid$(buf, 1, Len(buf) - 2)   'ファイルの最後の改行コードは、削除しておきます。   buf = ""  Next i    myDate = Format(Date, "yyyymmdd")  myPath = ThisWorkbook.Path    NewPath = myPath & "\" & myDate  'パスの有無を調べる  If Dir(NewPath, 16) = "" Then 'vbDirectory   MkDir NewPath  End If  For i = 0 To UBound(Ar)   FNo = FreeFile()   Open NewPath & "\" & Ar(i) For Output As #FNo   Print #FNo, SqlData(i) '出力も配列   Close #FNo  Next i End Sub '----------------------------------------------------

suzume_chu
質問者

補足

Wendy02さん、回答どうもありがとうございました! また、急な予定が入ってしまい、質問したにも関わらず書き込みが遅くなって申し訳ありませんでした。 >元のご質問のURLは出しておいたほうが良いかなって思います。 すみません。確かにこれでは今回の質問を読んだだけでは意味が分からないと思います。 実は、この作業の後に更に置き換えもしたいのですが、少しずつ教えていただいて自分で勉強しつつ置き換えをやってみよう、と質問を小出しにしてしまいました。 これでは何度も回答していただく事になりますし、どうしたいのかも伝わりにくかったと思います。 なので、この質問は一度解決にして、新たに質問を整理して投稿したいと思います。 丁寧に回答していただいたお二方にはご迷惑をおかけして申し訳ありませんでした。 もし宜しければまた是非回答をよろしくお願いいたします。

その他の回答 (1)

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

>その行数と同じ分、テキストデータをSQLテキストファイルにコピー ここの処理が分かりません。 縦に並んでいるセルの内容をただ横につなげるだけななのでしょうか?SQL文にしたいのなら、例えば SELECT A7,A8,A9... というような感じに繋げたいとかじゃないんですかね? それともエクセルの内容をそのままtxtにコピーしたのと同じ結果にしたいのか。 A7 A8 A9 ... と1行ずつ改行が入る形式。 あとこちらも何をしようとしているのか。どんな値を取ることを期待しているのでしょう。 >sqlData0 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_a" & Chr(13) & Chr(10) ActiveSheet.Rows("A7:")(xlDown) 意味が通じないのでこの時点でエラーが出ませんか? その後の文字列との連結("testdata_a")も改行が入る部分(Chr(13)やChr(10))も意味不明ですけど。 特定の行以下からから次の空白行までの行数を取得するならこういう感じになりますが。 ActiveSheet.Range("A7").End(xlDown).Row >うまくいきません。 というのはどううまくいかないのでしょう。txtへの保存ができないのか、保存した結果が期待したものにならないのか、具体的にこういう結果になって欲しいのだが、結果はこうなるみたいなモノがあるならそちらをあげられた方がよいかと。 どうされたいのかと、どこが間違っているのかも分からないし(にもかかわらず基本的なところはここを使いたいとの要望があるし)、またその要望の部分はtxtファイルの保存名と保存場所を決めている部分のようで幾らでも修正できる部分にしか思えないのですが。

suzume_chu
質問者

補足

回答どうもありがとうございます! また、急な予定が入ってしまい、質問したにも関わらず書き込みが遅くなって申し訳ありませんでした。 質問が分かりにくく、詳細も書いていなかったので回答していただく方にご迷惑をかけてしまいました。 改めて質問を整理して出直しますのでまたよろしくお願いいたします。

関連するQ&A

  • VBAでの行削除について

    教えてください。 現在、VBAを使用して、CSVファイルの編集をしたいと考えています。 フォルダ内に数個のCSVファイルがあり、それらにすべて同じ処理(行削除など)をしたいのです。 下記のようなプログラムです。 Sub getting() Dim myPath As String Dim myFName As String Dim FCnt As Integer Dim A(500) As String MsgBox CurDir() Workbooks("自動処理.xls").Activate myPath = ActiveWorkbook.Path MsgBox myPath ChDir myPath FCut = 0 myFName = Dir("*.csv") If myFName <> "" Then FCut = FCut + 1 A(FCut) = myFName Do myFName = Dir() If myFName <> "" Then FCut = FCut + 1 A(FCut) = myFName MsgBox A(FCut) Else Exit Do End If Loop End If MsgBox "「" & myPath & "」には、" & FCut & "個のファイルがあります。" Dim i As Integer Dim seet As String Dim ws As Object Dim FullPath As String For i = 1 To 1 seet = Left(A(1), 6) FullPath = myPath & "\" & A(i) 'Workbooks.Open(FullPath).Activate Open FullPath For Append As #1 Print #1, Rows("1:1").Select Selection.Delete Shift:=xlUp Rows("2:2").Select Selection.Delete Shift:=xlUp Range("A1").Select Print #1, Range("A1").Value = "" Print #1, Range("A1").Value = "COMP_NAME" Print #1, Range("B1").Select Print #1, ActiveCell.Value; "PC_OS" Print #1, Range("C1").Select Print #1, ActiveCell.Value = "OS_SUB_VERS" Print #1, Range("D1").Select Print #1, ActiveCell.Value = "IP_ADDR" Print #1, Range("E1").Select Print #1, ActiveCell.Value = "LOCATION " Close #1 ' Workbooks(A(i)).Save ' Workbooks(A(i)).Close savechanges:=False  Next i End Sub 教えていただきたいのは、どうにかworkbook.openを使わず、ファイルを編集できるところまでいったのですが、ファイルを開かずに行を削除することができません。   >Print #1, Rows("1:1").Select >Selection.Delete Shift:=xlUp >Rows("2:2").Select >Selection.Delete Shift:=xlUp ファイルを開かずに行削除をできるものなのでしょうか。 ご存知の方がいれば教えてください。 よろしくお願いいたします。

  • エクセルVBAでボタンを割り当てて、そこに入力行数とCSV形式出力をおこなうように記述したい。

    エクセルのVBAでエクセルの入力データをCSVに出力するVBAを書こうとしておりますが、2点ほどわかりません。 まず、入力行数を調べたいのですが、A列で入力があるところまでを個数としたいのですがどのように求めるかわかりません。 あと、データをCSV形式でファイルに落としたいのですがどうすればよいのでしょうか? Dim fp As Integer Dim fname As String dim num as integer num = 入力数(たとえば、a列に入力がある行数など)  msgbox("入力行数=" & cstr(num) & "です。") fname = "test.csv" fp = FreeFile Open fname For Output As #fp CSV形式で出力する Close #fp

  • Excel VBA連続コピー、貼付処理について

    特定のフォルダ内に格納されている複数のExcelファイルの「sheet1」シートのデータを 所定のExcelファイルにコピー&ペーストしたいのですが、うまくいきません。 (貼付先のファイルを閉じようとするとエラーが発生します。) どうすればできるようになるでしょうか? ご教授の程よろしくお願いいたします。 -------------------------------------------------------------------- Sub copy_test() Dim myPath As String Dim copyFile As String Dim pasteFile As String Dim n As Long myPath = "C:\copy\" copyFile = Dir(myPath & "*.xls*") pasteFile = "C:\paste\paste_data.xlsx" n = 2 Do Until copyFile = "" Workbooks.Open Filename:=myPath & copyFile Workbooks(copyFile).Worksheets("sheet1").Range("A2:L201").Copy Workbooks.Open Filename:=pasteFile 'Workbooks(pasteFile).Worksheets("paste_data").Active Range("B1").Select Selection.End(xlDown).Select Selection.End(xlToLeft).Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveWorkbook.Save Workbooks(pasteFile).Close False Application.CutCopyMode = False Workbooks(copyFile).Close False n = n + 999 copyFile = Dir() Loop End Sub ---------------------------------------------------------------------------------

  • 【excel vba】 時刻データのチェック

    dim myDate as Variant myDate = activesheet("xxx.xls").range("A1") if <<<myDateが、"hh:mm::ss"形式のデータかどうか? >>> then 処理1 end if と、したいのですが、 <<<・・・・・>>> の記述内容がわかりません。 ご教授お願い致します。

  • VBAトラブル

    Sub 百人一首一番から二十番() Dim hyakuSh As Worksheet Dim mySh As Worksheet Set mySh = Worksheets("百人一首クイズ") Set hyakuSh = Worksheets("百人一首") Dim myRow As Integer Randomize myRow = Int((21 - 2 + 1) * Rnd + 2) Dim kaminoku As String Dim kaminoku2 As String Dim kaminoku3 As String Dim simonoku As String Dim simonoku1 As String Dim sakusha As String kaminoku = hyakuSh.Cells(myRow, 3).Value kaminoku2 = hyakuSh.Cells(myRow, 4).Value kaminoku3 = hyakuSh.Cells(myRow, 5).Value shimonoku = hyakuSh.Cells(myRow, 6).Value shimonoku1 = hyakuSh.Cells(myRow, 7).Value sakusha = hyakuSh.Cells(myRow, 8).Value mySh.Activate mySh.Shapes("Text Box 2").Select Selection.Characters.Text = kaminoku & Chr(10) & kaminoku2 & Chr(10) & kaminoku3 Dim MyTBox As Integer Dim smRow As Integer Dim smRow2 As Integer Dim smRow3 As Integer Dim smRow4 As Integer Dim smRow5 As Integer Dim i As Integer mySh.Shapes(2).Select Randomize smRow5 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow5, 6).Value & Chr(10) & hyakuSh.Cells(smRow5, 7).Value & Chr(10) & hyakuSh.Cells(smRow5, 8).Value mySh.Shapes(3).Select Randomize smRow = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow, 6).Value & Chr(10) & hyakuSh.Cells(smRow, 7).Value & Chr(10) & hyakuSh.Cells(smRow, 8).Value mySh.Shapes(4).Select Randomize smRow2 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow2, 6).Value & Chr(10) & hyakuSh.Cells(smRow2, 7).Value & Chr(10) & hyakuSh.Cells(smRow2, 8).Value mySh.Shapes(5).Select Randomize smRow3 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow3, 6).Value & Chr(10) & hyakuSh.Cells(smRow3, 7).Value & Chr(10) & hyakuSh.Cells(smRow3, 8).Value mySh.Shapes(6).Select Randomize smRow4 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow4, 6).Value & Chr(10) & hyakuSh.Cells(smRow4, 7).Value & Chr(10) & hyakuSh.Cells(smRow4, 8).Value Randomize MyTBox = Int((6 - 2 + 1) * Rnd + 2) mySh.Shapes(MyTBox).Select Selection.Characters.Text = shimonoku & Chr(10) & shimonoku1 & Chr(10) & sakusha mySh.Shapes("Text Box 2").Select Dim Ans As Integer Ans = InputBox(hyakuSh.Cells(myRow, 3).Value & hyakuSh.Cells(myRow, 4).Value & hyakuSh.Cells(myRow, 5).Value & Chr(10) & Chr(10) & "下の句を番号で答えなさい", Title:="百人一首", Xpos:=7500, Ypos:=2500) If Ans = MyTBox Then MsgBox " 正解!!! V(・ o ・)V " Else MsgBox ("間違いです!!!!!!!!" & Chr(10) & Chr(10) & hyakuSh.Cells(myRow, 6).Value & hyakuSh.Cells(myRow, 7).Value & Chr(10) & Chr(10) & sakusha & "です") End If End Sub 以上のマクロをエクセルで作ったのですが、VBE~マクロを走らせると順調に走るのですが、マクロをボタンに登録すると、Inputbox に解答を掘り込んであげないと、kaminokuもshimonokuもあたらしいものになりません 今マクロはシート上にあります、マクロを標準モジュールに移しても同じ結果です。何か解決策はありますか? かなり古くエクセル2000です、初心者なので難しいこことはわかりませんが、よろしくお願いします。

  • VBAに関して

    VBA超初心者の者ですが、ある一つのシートにいくつかの別のファイルを開いて順にコピーして貼り付けていくというプログラムを作成したいと思っています。 Sub naka() Dim k As Integer Dim r As String k = InputBox("ファイル数を記入してください") r = InputBox("範囲を指定してください") Call s1(k, r) End Sub Sub s1(i As Integer, rangearea As String) Dim v As Integer Dim x As String For v = 1 To i Dim OpenFileName As String With OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") ThisWorkbook.Sheets(1).Range("rangearea").Copy ActiveSheet.Range("1+(rangearea.rows.count*(v-1)),1").PasteSpecial End With Next v End Sub こんな感じでかいてみたものの全く異なったものをかいているようです。同じフォルダ内にコピーするファイルが存在しているものと仮定していますが、マイ ドキュメント内のファイルとしたいです。コピーすべきシートは1としています。大変分かりづらい文章ですが、おかしい部分の指摘、見本等示していただけたらありがたいです。

  • テキストデータを出力するVBAがうまく動きません

    いつもお世話になっております。 複数あるシートのうち、シート名が数字になっているシートの一部をテキストファイルに出力するVBAを作成していますが、うまく動作しません。 (テキストファイルは作成できますが、データが書き込まれていません) シートをすべて検索しているのは、使用する人によってシート数がことなるためです。 おそらく繰り返し処理の部分で、何かおかしなことをやっているのだと思いますが、見ていただいて悪いところがありましたら、教えていただけますでしょうか。 Const Separater = "," ' 区切り文字をカンマに設定 '------------------------------------------------------------ Sub saveFile(fileName As String) '------------------------------------------------------------ Dim filePath As String Dim nowdate As String Dim startcd As Integer Dim endcd As Integer Dim St As Worksheet Dim Stn As String startcd = 0 endcd = 0 nowdate = Year(Date) & Month(Date) & Day(Date) filePath = fileName & nowdate & ".txt" '----filename は「savefile」を呼び出す際の引数 Dim dataRange As Range On Error Resume Next CreateObject("Scripting.FileSystemObject").createTextFile (filePath) '---- 全シート名のチェック For Each St In ThisWorkbook.Worksheets Stn = St.Name If IsNumeric(Stn) Then Worksheets(Stn).Activate Set dataRange = ActiveSheet.Range("A5:E71") '---- ファイルの書き込み処理 Dim RowStart%, RowEnd%, RowIndex% '--- 変数を整数型として宣言 RowStart = dataRange.Row RowEnd = dataRange.Row + dataRange.Rows.Count - 1 Dim ColStart%, ColEnd%, ColIndex ColStart = dataRange.Column ColEnd = ColStart + dataRange.Columns.Count - 1 Dim oneLine As String For RowIndex = RowStart To RowEnd '---- 1行の作成 oneLine = Stn & Separater & Cells(RowIndex, ColStart).Value For ColIndex = ColStart + 1 To ColEnd oneLine = oneLine & Separater & Cells(RowIndex, ColIndex).Value Next CreateObject("Scripting.FileSystemObject").writeLine oneLine '---- 1行の出力 Next End If Next St CreateObject("Scripting.FileSystemObject").Close '---- ファイルのクローズ End Sub

  • Access テキスト インポート

    現在指定したファイルしかインポートしが出来ないのでこれを 指定したファイルをインポートしたいのですがどのようすれは、いいでしょうか?よろしくお願いします。 Private Sub コマンド5_Click() On Error Resume Next Dim MsgNo As Integer Dim Msg1, Msg2, Msg3 As String Dim su As String Dim cut As Integer Dim fd As String Dim suu As String Dim db As Database Dim d1 As Recordset Msg1 = " インポートを開始します。" Msg2 = "「DAT」ファイルがありません。" Msg3 = "「DAT」ファイルを c:\DATデータにコピーし、再度実行して下さい。" MsgNo = MsgBox(Chr(9) & Msg1 & Chr(9), 1) If MsgNo = 2 Then 'キャンセルボタンで終了 GoTo Exit_インポート_Click End If EmptyAllTable 'テーブルクリア Set db = CurrentDb Set d1 = db.OpenRecordset("t_製品データ") fd = Dir("C:\DATデータ\*.dat") If fd = "" Then 'ファイルがなければ、メッセージを表示、処理を戻します。 Beep MsgNo = MsgBox(Msg2 & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Msg3, 16) GoTo Exit_インポート_Click End If

  • VBAでブック名の拡張子を除去してシートにコピー

    VBA初心者でコード作成で困っております。 下記の通りコードを組みましたが、シート名をブック名に変更して 保存したいのですが、このコードですと拡張子までついてしまいます。 拡張子を除去するためにはどうすればよいでしょうか? アドバイス宜しくお願い致します。 Sub test() 'シート名の変更 Dim MyPath As String Dim MyFile As String Dim Wb As Workbook MyPath = "C:\TEST\" MyFile = Dir(MyPath & "*.xlsx") Do While MyFile <> "" Set Wb = Workbooks.Open(MyPath & MyFile) ActiveSheet.Name = ActiveWorkbook.Name Application.DisplayAlerts = False Wb.Save Application.DisplayAlerts = True Wb.Close (False) MyFile = Dir() Loop End Sub

  • VBA 文字列の抜き出し

    VBAで文字列の抜き出しの方法を教えてください。 同様な質問があり、参考にしてみたのですがうまくいきません。 お分かりの方がいましたらご享受お願いいたします。 30~45字からなる文字列があります。 その中に特定の文字列が2つあり、そのうちの最初の特定文字列に続く文字2つ目の特定文字列前までを抜き出したいのですがうまくいきません。 具体的には abcdefghi GN=12jikl PE=fghj456 という文字列のなかから"GN="と"PE="の中間の文字を取り出したいのですが、 自分で書いたものでは"PE="以上が抜き出され、"GN="より前の文字列を抜き出せませんでした。 GN=......, PE=......の文字数はそれぞれ不規則です。また、GN=...よりも前の文字数も不規則です。 以下が作成したものです。 Dim i As Integer Dim Srch As String Dim Btwn As String Const Chr1 As String = "GN " Const Chr2 As String = "PE" Dim m As String Set sheetobj = ThisWorkbook.Worksheets("A") With sheeobj lastrow = sheetobj.Cells(sheetobj.Rows.Count, 10).End(xlUp).Row For i = 2 To lastrow Srch = sheetobj.Cells(i, 10) Btwn = Mid(Srch, InStr(Srch, Chr1) + 1, InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1) sheetobj.Cells(i, 9) = Btwn Next i End With End Sub なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

専門家に質問してみよう