![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
No.7ベストアンサー
- 回答日時:
遅くなってすみません。
テレビで、齋藤孝氏が「拙速は巧遅に勝る」とか言っていたのですが、ここの掲示板では、特にそれが求められるようで、気をつけたいのですが、なかなか思うに任せません。
>BaseName = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, "."))
これでは、うまく行きませんね。私は、前言の說明で忘れていたようです。
Personal.xlsb の場合は、ちょっと特殊になってしまいます。そこにマクロが入っているわけですから、この段階で、どこの場所と明示されていません。省略すると、デフォルトの可能性が出てきてしまいます。(Application.DefaultFilePath) これは、アドイン型に直しても同様です。
デフォルトのファイルの置き場所にない以上、この場合は、ActiveWorkbook.Path の場所がどうしても入手しなくてはならなくなっています。
>エクセルファイルでは4行目から貼り付けたいと思っています。
Cells(i + 1, 1).Resize(, UBound(buf) + 1).Value = buf 'A1 から貼り付け
i + 1 =1行目 -> i + 4 =4行目
i というのは紛らわしいのですが、buf の配列変数にそれぞれの入れ物のindex の番号で 0から始まるように出来ています。
Sub GetSAmeNameTextOpenR()
Dim BaseName As String
Dim Fname As String
Dim myPath As String
Dim TextLine As String
Dim i As Long, j As Long
Dim ArLines
Dim Fno As Integer
Dim buf
'***開始行**
j = 5
'*****
myPath = ActiveWorkbook.Path & "\" 'パス
BaseName = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, "."))
Fname = myPath & BaseName & "txt"
If Dir(Fname) = "" Then _
MsgBox Fname & "は、ここには見つかりません。", vbCritical: Exit Sub
Fno = FreeFile()
Open Fname For Input As #Fno
Line Input #Fno, TextLine
Close #Fno
ArLines = Split(TextLine, vbLf)
For i = 0 To UBound(ArLines) - 1
buf = Split(ArLines(i), vbTab)
Cells(i + j, 1).Resize(, UBound(buf) + 1).Value = buf 'Aj から貼り付け Cells(j, 1) Aj
Next
End Sub
'//
以上ですが、私の今までの経緯からの予感では、この先、いろいろと難問が出てくるのではないかと思っています。
これは、SJIS ですが、UTF-8, UTF-16 の文字コードが変わった場合、または、文字コードの自動判別など、今回のLF 改行コードも、そのひとつです。一見簡単そうに思えても、Unicode ライクのテキストデータのCSV などは、滅多に出会わない種類のものです。
しかし、Excelでは、難しい内容ですも、Sakura Editor の他のテキスト・エディターに優れた機能には、どのエディターよりも豊富な正規表現や変換機能が使えるという利点を生かして、テキストファイルの加工が可能です。困った時には、このエディターで試してみると、思わぬ解決策が見つかることがあります。
今回もありがとうございます。
希望どおりに動きました。
申し訳ないのですが、さらに伺ってもよいでしょうか。
「Line Input #Fno, TextLine」の TextLineとはどういう意味ですか?
#Fnoに格納したファイル名のファイルを入力するときに、テキスト形式で行うというような意味でしょうか。
また、
ArLines = Split(TextLine, vbLf)
For i = 0 To UBound(ArLines) - 1(この行はなんとなくわかりますが)
buf = Split(ArLines(i), vbTab)
の流れも理解できなかったのですが、どういう動きですか?
No.8
- 回答日時:
>「Line Input #Fno, TextLine」の TextLineとはどういう意味ですか?
このTextLine という名称自体は特に何でもよいのです。別に決まりはありません。ただ、実際に、一行ずつ読み取っています。(先頭文字から[改行]までの1行) その改行自体が認識しないと、ひとつの切れ目のないテキストファイルになってしまいます。
その切れ目がないテキストファイルでも、Lf (文字コード:10) で区切って、行を作ってあげます。
ArLines = Split(TextLine, vbLf)
For i = 0 To UBound(ArLines) - 1(この行はなんとなくわかりますが)
×マイナス1にしているのは、0をスタートしているから、1引きました。
◎訂正します。ここは、-1をしなくても良かったでした。最後尾の文字が欠けたかもしれません。
For i = 0 To UBound(ArLines) '◎
buf = Split(ArLines(i), vbTab)
それで、今度は、実際の1行に、タブの入っているということで、タブで切り分けて、セルに横の方向に入れています。
何度も誠にありがとうございました。
-1の件ですが、-1をしないとエラーになってしまいます。
VBAの仕様なのかわかりませんが、iが1ではなく0から始まっている時点で、最終行を表現するときも実際の行数から-1をしないといけないのではないかと思いました。
No.5
- 回答日時:
こんにちは。
>Personal.xlsbに
これ自体は、ThisWorkbook とあるところを、ActiveWorkbook にしていただければよいです。
置換機能を使って交換しても、手作業でもよいのですが、残さないようにしてください。
>myPath = ThisWorkbook.Path & "\" 'Excel と同じ場所にあるなら、ChDrive,ChDir は不要
これは、前回のコードをそのまま残しているだけです。
だから、インポートされる側のブックとテキストファイルが同じ場所にあるのなら、
'---MyPath は不要
BaseName = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, "."))
Fname = BaseName & "txt" 'Excelと同じフォルダ等にする
ということになります。
------------
もう少し細かい說明が必要ですか?
つまり、Excelは、起動して、デフォルト・ファイルパスというフォルダを参照するように出来ています。(通常は、C:\Users\UserName\OneDrive\ドキュメント\ など)また、保存するフォルダも同じ場所にするように出来ています。
それを特殊な場所、例えば、C:\ などとする場合は、そのC:\ にExcelファイルがあれば、そのExcelファイルのある場所を参照するように、マクロで変えています。それを別な場所にファイルが置いてある場合は、デフォルトの参照フォルダーを変えてあげなくてはならないということです。
Chdrive =ドライブを変える、ChDir =フォルダを変える
『Dドライブ直下のフォルダに、001、002というような数字の名称を付したエクセルファイルとテキストファイルがあります。』
ちょっと気を回しすぎかもしれませんが、往々にして、こういう原則というものは、忘れ去られてしまうことが多いのです。さて、実際にはどんなものかは、私は分からないのですが、素人マクロではない限りは、予想されるエラーや不具合は予め対応しておいても良いと思っているのでした。
何度も誠にありがとうございます。
ActiveWorkbook にしたら動きましたし、MyPathの説明もおおよそ理解できました。
しかし、貼り付け先のエクセルファイルと貼り付け元のテキストファイルは同じフォルダにあるため、以下のように簡略化したのですが、テキストファイルが見つからないというエラーが出てしまいます。
また、テキストファイルは1行目からがコピー範囲ですが、エクセルファイルでは4行目から貼り付けたいと思っています。
「For i = 0 To UBound(ArLines) - 1」を「For i = 3 To UBound(ArLines) - 1」とすると3行目から貼り付けはされるものの、テキストファイルの最初の3行のデータがコピペされていないし、どのように修正すればよいでしょうか。
Sub GetSAmeNameTextOpenR()
Dim BaseName As String
Dim Fname As String
Dim myPath As String
Dim TextLine As String
Dim i As Long
Dim ArLines
Dim Fno As Integer
Dim buf
BaseName = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, "."))
Fname = BaseName & "txt"
If Dir(Fname) = "" Then _
MsgBox Fname & "は、ここには見つかりません。", vbCritical: Exit Sub
Fno = FreeFile()
i = 1
Open Fname For Input As #Fno
Line Input #Fno, TextLine
Close #Fno
ArLines = Split(TextLine, vbLf)
For i = 0 To UBound(ArLines) - 1
buf = Split(ArLines(i), vbTab)
Cells(i + 1, 1).Resize(, UBound(buf) + 1).Value = buf 'A1 から貼り付け
Next
End Sub
No.4
- 回答日時:
こんばんは。
>改行コードは全てLEです。(サクラエディタで開くと「↓」です)
不具合は、了解しました。
LF のことですね。Line Feed の短縮系だったと思います。
当面のトラブルだけの問題解決になりますが、以下のようになります。
'//標準モジュール
Sub GetSAmeNameTextOpenR()
Dim BaseName As String
Dim Fname As String
Dim myPath As String
Dim TextLine As String
Dim i As Long
Dim ArLines
Dim Fno As Integer
Dim buf
myPath = ThisWorkbook.Path & "\" 'Excel と同じ場所にあるなら、ChDrive,ChDir は不要
BaseName = Mid(ThisWorkbook.Name, 1, InStrRev(ThisWorkbook.Name, "."))
Fname = myPath & BaseName & "txt" 'Excelと同じフォルダ等にする
If Dir(Fname) = "" Then _
MsgBox Fname & "は、ここには見つかりません。", vbCritical: Exit Sub
Fno = FreeFile()
i = 1
Open Fname For Input As #Fno
Line Input #Fno, TextLine
Close #Fno
ArLines = Split(TextLine, vbLf)
For i = 0 To UBound(ArLines) - 1
buf = Split(ArLines(i), vbTab)
Cells(i + 1, 1).Resize(, UBound(buf) + 1).Value = buf 'A1 から貼り付け
Next
End Sub
ありがとうございます。
誠に申し訳ないのですが、Personal.xlsbに保存して動くようにはできませんか?
また、「 'Excel と同じ場所にあるなら、ChDrive,ChDir は不要」という部分が理解できなかったのですが、どういう意味か教えていたただけると幸いです。
No.3
- 回答日時:
まず、最初に、こちらが理解していないまま推し進めたのですから、いろんな問題は残っているはずです。
>テキストファイルが複数行に値が書いてある場合でも、それをエクセルファイルに貼り付けるとすべてが1行に収まって妙な形で貼り付けられてしまいます。
それは、予想だにしていませんでしたね。テキスト・ファイルなのに、そのような現象になるというのは、そのテキストファイルは、Windows/DOS系のものですか?
>拡張子は違いますが)のデータを貼り付けることはできました。
それで、文字化けのほうはしなかったのですね。しかし、拡張子が違うというのは、本当はテキストファイルではないかもしれません。テキストファイルだと思い込んでいるのに、実際は違う例が多々遭遇します。また、Mac系、Unix系のテキストファイルでも、そういう現象が起こります。
まず、そのファイルの末尾の改行コードは何か教えてください。おそらく、LF コードだと思いますが、いたるところに存在しているのですか、それとも、それがすべてなのですか?これは単なる確認事項ではあるけれども、それがすべてなら、Unix系のファイルだと思います。また、文字コードもついでに教えてください。
元は、データベースファイルのテキストファイル出力も同様ですが、拡張子が、.txt ではないというのは、「トラブル発生の原因」になります。
No.2
- 回答日時:
こんにちは。
>データがそのエクセルファイルに貼り付けられるコードについてご教示願います。
そのままの通りのコードあるのですが、大掛かりになってしまいます。
現在の文字コードでは、S-JISになっていますから、これがUTF-8やUTF-16 の場合は、文字コードの変換を必要とします。Excelのシート自体は、UTF-16は対応しています。実にややこしい場合があります。(前回の質問からすると、可能性大です)
また、中身の文字コードも、指定されていれば問題は少ないのですが、UTF-16 Big Endian, Little Endian で、最初の信号がない場合に失敗する可能性が高いです。UTF-8には、そういう問題はありません。
失敗の場合(テキストファイルの文字コードが不明な場合)
「全体をコピーして、エクセルファイルに貼り付けると、」にしてほうが失敗は少ないですが、こちらにすると、試みた回数が少ないので、あまり自信がありません。
>Dドライブ直下のフォルダに
ルートのことでしょうか?
>それぞれの名称のファイルが、エクセルファイルとテキストファイルの2つずつあります
意味がよく分かりませんでしたので、同名のベースネーム(拡張子がない名前)を対象としました。
'//
Sub GetSAmeNameTextOpen()
Dim BaseName As String
Dim Fname As String
Dim myPath As String
Dim TextLine As String
Dim i As Long
Dim buf
' ChDrive "D:\" '//ExcelとTextファイルと同じフォルダならいりません。
'ChDir "C:\Temp" '// 直下のフォルダですと後は任意
myPath = ThisWorkbook.Path & "\" 'Excel と同じ場所にあるなら、ChDrive,ChDir は不要
BaseName = Mid(ThisWorkbook.Name, 1, InStrRev(ThisWorkbook.Name, "."))
Fname = myPath & BaseName & "txt" 'Excelと同じフォルダ等にする
If Dir(Fname) = "" Then _
MsgBox Fname & "は、ここには見つかりません。", vbCritical: Exit Sub
FNo = FreeFile()
i = 1
Open Fname For Input As #FNo
Do While Not EOF(FNo)
Line Input #FNo, TextLine
buf = Split(TextLine, vbTab)
Cells(i, 1).Resize(, UBound(buf) + 1).Value = buf 'A1 から貼り付け
i = i + 1
Loop
Close #FNo
End Sub
毎度、ありがとうございます。
申し訳ないのですが、前半は理解できませんでした。
>>Dドライブ直下のフォルダに
> ルートのことでしょうか?
すみません。ローカルディスクのCドライブの間違いでした。
しかし、書いていただいたコードで、エクセルファイルと同じ名称のテキストファイル(拡張子は違いますが)のデータを貼り付けることはできました。
問題点についてですが、テキストファイルが複数行に値が書いてある場合でも、それをエクセルファイルに貼り付けるとすべてが1行に収まって妙な形で貼り付けられてしまいます。
テキストファイルと同じ行数でエクセルファイルに貼り付けることは可能ですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Access(アクセス) Access VBA を利用して、フォルダ内のファイルの名称を変更したい 1 2023/08/03 08:27
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) エクセルで、ファイルの分割 と ファイルの集約 1 2022/08/28 08:58
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) エクセルのマクロについて教えてください マクロを実行して 作業フォルダの中にある PDFファイル名を 3 2023/07/01 15:16
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAが徐々に遅くなる
-
既存のテキストファイルを開く方法
-
ファイルのチェックサムを改行...
-
ASP.NET Web上のテキストファ...
-
エクセルVBAでメールの自動作成...
-
Google検索履歴のテキストファ...
-
テキストファイルってページの...
-
【至急:C言語】cppファイルやh...
-
バイナリデータの中からMidのよ...
-
VB(VBA)で、バイナリデータを使...
-
ATTファイルってどうやって開け...
-
テキストファイルの特定行の削...
-
テキストファイルの一部分を抽...
-
フォーム無しでアプリを作成す...
-
VBA。開いているテキストファイ...
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
サイトマップにサブドメインを...
-
iTextでPDFを表示させたら日本...
-
TransferSpreadsheetでフルパス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ATTファイルってどうやって開け...
-
Excel VBAが徐々に遅くなる
-
テキストファイルの一部分を抽...
-
既存のテキストファイルを開く方法
-
テキストファイルの特定行の削...
-
StreamReaderで読み込んだファ...
-
VBA。開いているテキストファイ...
-
VB(VBA)で、バイナリデータを使...
-
Windowsのメモ帳でUTF-8を選択...
-
テキストファイル固定長データ...
-
バイナリデータの中からMidのよ...
-
テキストファイルをSQLServerデ...
-
ファイル変換
-
テキストファイル内容の、16進...
-
パイソンでのテキストデータの...
-
[VB.NET] 処理の高速化を行いた...
-
RGBデータからBMP画像へ
-
C言語でテキストファイルをバイ...
-
エクセルVBAでメールの自動作成...
-
TXTファイルデーターをEX...
おすすめ情報