テキストファイルで
123 234 456 789 098 234 555 765
234 567 891 234 123 334
567 891 234 123 234 103 456 871
456 789 123 567 222 356
というように計測データが並んだとき、簡単にエクセルに縦に並べることができないでしょうか?自分はマクロはほぼわかりません。
実際にやりたいのは、簡単に言うと例えば上の2段をX軸座標。下2段をY座標としたいのですが。
現状ではまず上の2段の数字を区切りでEnterをし、テキストファイル上で縦1列にしてからエクセルのシートに貼り付けていますが、データ量が多いので効率が大変悪いです。ちなみに数字と数字の間はおそらくタブ区切りです。
複数空白への対応版です。
Sub Macro1() Dim S_Read As String Dim S_FName As String Dim V_DataArray As Variant Dim V_Data As Variant Dim L_Count As Long S_FName = "a.txt": 'ファイルはxlsファイルと同じフォルダにあるという前提 Cells.Select: 'アクティブなシートの全体を選択 Range("A1").Activate: 'セルA1をアクティブにする Selection.ClearContents: '全クリア Open ActiveWorkbook.Path & "\" & S_FName For Input As #1: 'ファイルを開く Do Until EOF(1): 'ファイルの最後までループ Line Input #1, S_Read: '1行分読み取り V_DataArray = Split(S_Read, " "): '区切り文字で分割(タブの場合は" "ではなくvbTab) L_Count = 0: '有効データのカウンター For Each V_Data In V_DataArray: '分割されて出来たデータ分のループ If Trim(V_Data) <> "" Then ActiveCell.Value = V_Data: 'セルへの書き込み ActiveCell.Offset(1, 0).Select: '1つ下のセルへの移動 L_Count = L_Count + 1: 'カウントアップ End If Next V_Data: 'Forに戻る If L_Count = 2 Then ActiveCell.Offset(1, 0).Select: 'データが1行に二個しかなかった場合はもう一つしたのセルへ移動 End If Loop: 'Doに戻る Close #1: 'ファイルを閉じる End Sub
http://arena.nikkeibp.co.jp/qa/20060208/115307/
そのままテキストファイルのデータをコピーして エクセルに貼り付けます。
次に、その貼り付けたセルを選択しコピーし
違う場所か違うシートで
右クリック
形式を選択して貼り付け
行列を入れ替える にチェックし
OKとします。
すると横のが縦になりますが、これでどうでしょうか?
123 234 456 789 098 234 555 765
234 567 891 234 123 334
567 891 234 123 234 103 456 871
456 789 123 567 222 356
を
123
234
~
123
334
567
891
~
222
356
と一列に並ベたいということであれば、
(1)ExcelではなくWordで開き、
(2)編集→置換 にて
(3)検索する文字列の欄に 区切りの空白部分を入れて、
※区切りの空白部分がタブか空白か判らないのであれば、空白部分を選択してコピーしたものを検索する文字列欄に貼り付けても良いです。
(4)置換後の文字列の欄に ^p を入れ、
※^p は改行を意味します。半角で入れてください。
(5)すべて置換を実行します。
(6)後は、テキストファイルとして保存
※コピーしてExcelに貼り付けてもOK
だいぶ使いやすくなりましたが、欲をいいます。
まず、ワードで開いてマクロを実行することによって、先ほどの処理(置換→テキストファイルに出力)をすることは可能でしょうか?また、改行しているところが空白になるのをつめることは出来ないでしょうか?また、X,Y座標ともにの最後のデータは2つ(他は一行に6つのデータ。合計50のデータ)なのですが、そこで区切りの改行を入れることは可能でしょうか?
エディタを使っていますか?
エディタの置換機能を使って、\t(タブ)を\n(改行)に置換すれば、簡単に1行になります。
私が使っているのは「Tera Pad」です。
http://www.vector.co.jp/soft/dl/win95/writing/se104390.html
「ファイルのダウンロード」で「開く」ボタンを押せば自動的に解凍します。
後は、別名でセーブした上でエクセルから読み込ませて下さい。
お使いのエディタにも「置換」機能があると思いますので、エディタのヘルプを参考にして同様の処理をしてみて下さい。
同様に出来たのですが、2つ目のコメント欄のようなことは実行不可能でしょうか?
ロガーから出力されたテキストファイルをお見せして説明できればともどかしく思います。
Wordにはマクロ記録というものがありますので、マクロ記録を開始してから一連の動作を行うだけでマクロが完成します。
(以下、Word2000のマクロ記録で作成したものです。手直ししなければならない部分もありますので参考だけとして、実際にご利用になる分に関しましてはコピペではなくてマクロ記録で作ってください。)
■置換
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " "
.Replacement.Text = "^p"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
空白ではなくタブの場合は
.Text = vbTab
になります。
■保存
ChangeFileOpenDirectory "C:\"
ActiveDocument.SaveAs FileName:="123.txt", FileFormat:=wdFormatText, _
LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False
保存先フォルダ(例では "C:\")はフルパスで指定し最後が\で終わるようにします。
>空白になるのをつめる
>区切りの改行
Wordでもできますが、そこまでするのであればExcelVBAで『1行読み込んでは分解してセルに書き出し』というマクロを造ったほうが早そうです。
Word/Excelのバージョンを書き込めばコピペで使えるようなマクロを誰かが作ってくれるかもしれませんので、書いておくことをお勧めします。
一人2回までなので、ここまでとなりますが、コメント欄を使えるような設定に変えていただければ、判る範囲では追従していきます。
(質問者さんにはページの下のほうに設定を変えるところが見えているはずですから確認してみてください)
大変ありがとうございます。
バージョンは両方とも2000です。
設定も変更いたしましたので、又何かございましたらお願いします。
単純にテキストファイルの置換ツールを使用されてはいかがでしょうか?
http://www.vector.co.jp/soft/win95/util/se359701.html
これらのツールでTabを改行コードに置き換えることで同様のことが出来ると思います。
すいません。客先がフリーソフトのダウンロード禁止なんで。
エクセルのマクロで やってみました。
Sheet1にそのまま 貼り付けて
Ctrl+q とすれば Sheet2に作成されます。
マクロの使い方は Word等と同じです。
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+q
'
' aが 元 bが作成先になります。
a = "Sheet1"
b = "Sheet2"
e = 1
For c = 1 To 65536
If Cells(c, 1) = "" Then Exit For
For d = 1 To 255
If Cells(c, d) = "" Then Exit For
Sheets(b).Cells(e, 1) = Sheets(a).Cells(c, d)
e = e + 1
Next d
Next c
End Sub
すいません。マクロに関しては超が付く初心者なんでわかりませんでした。
上記のワードでのマクロでは数値と数値の間に2~3つの改行が出来たのですが、一応縦一列にはなりました。
Excel2000での例です。
6/のtakntさんのほうはテキストファイルをSheet1に開いた状態から始まるものですが、こちらはテキストファイルを読みこんでセルに書き出す方法を取っています。
こちらをさらに改良してファイルオブジェクトを扱えるようにすればファイル選択ダイアログをだしたりするなんて事も可能です。
(ダイアログ等に関しては高度になりますので、今回のところは下記コードの意味をキッチリと理解できるようにがんばってください。)
Sub Macro1() Dim S_Read As String Dim S_FName As String Dim V_DataArray As Variant Dim V_Data As Variant S_FName = "a.txt": 'ファイルはxlsファイルと同じフォルダにあるという前提 Cells.Select: 'アクティブなシートの全体を選択 Range("A1").Activate: 'セルA1をアクティブにする Selection.ClearContents: '全クリア Open ActiveWorkbook.Path & "\" & S_FName For Input As #1: 'ファイルを開く Do Until EOF(1): 'ファイルの最後までループ Line Input #1, S_Read: '1行分読み取り V_DataArray = Split(S_Read, " "): '区切り文字で分割(タブの場合は" "ではなくvbTab) For Each V_Data In V_DataArray: '分割されて出来たデータ分のループ ActiveCell.Value = V_Data: 'セルへの書き込み ActiveCell.Offset(1, 0).Select: '1つ下のセルへの移動 Next V_Data: 'Forに戻る If UBound(V_DataArray) = 2 Then ActiveCell.Offset(1, 0).Select: 'データが1行に二個しかなかった場合はもう一つしたのセルへ移動 End If Loop: 'Doに戻る Close #1: 'ファイルを閉じる End Sub
>Open ActiveWorkbook.Path & "\" & S_FName For Input As #1: 'ファイルを開く]
ここで構文エラーになり直すことが出来ませんがどうすればいいでしょうか。
色々とやり方がでていますが、関数マニアとして、関数一本でやっつける方法を一つ。
コメント欄に記載されている、
データが6列×9行の50データをひとくくりの一列にするという処理をするとして、
=INDEX('1'!$A:$F,1+(ROW()-ROW(A$1))*9+(ROUNDDOWN((COLUMN()-1)/6,0)),COLUMN()-(ROUNDDOWN((COLUMN()-1)/6,0)*6))
これでSheet1に、二列に自動表示されると思うのですが。
尚、
データを貼り付ける「1」シート名は↑の式の「'1'」の1の部分を該当名に変更すれば、
自由に変更できます。
また、二系列以上(2行以上)に変換するときは、そのまま数式をフィルコピーして使えます。
以上ご参考まで。
1列50セルにコピーしたらOKだったのですが、2列25行にコピーすると2列目には0しか出ませんでした。
複数空白への対応版です。
Sub Macro1() Dim S_Read As String Dim S_FName As String Dim V_DataArray As Variant Dim V_Data As Variant Dim L_Count As Long S_FName = "a.txt": 'ファイルはxlsファイルと同じフォルダにあるという前提 Cells.Select: 'アクティブなシートの全体を選択 Range("A1").Activate: 'セルA1をアクティブにする Selection.ClearContents: '全クリア Open ActiveWorkbook.Path & "\" & S_FName For Input As #1: 'ファイルを開く Do Until EOF(1): 'ファイルの最後までループ Line Input #1, S_Read: '1行分読み取り V_DataArray = Split(S_Read, " "): '区切り文字で分割(タブの場合は" "ではなくvbTab) L_Count = 0: '有効データのカウンター For Each V_Data In V_DataArray: '分割されて出来たデータ分のループ If Trim(V_Data) <> "" Then ActiveCell.Value = V_Data: 'セルへの書き込み ActiveCell.Offset(1, 0).Select: '1つ下のセルへの移動 L_Count = L_Count + 1: 'カウントアップ End If Next V_Data: 'Forに戻る If L_Count = 2 Then ActiveCell.Offset(1, 0).Select: 'データが1行に二個しかなかった場合はもう一つしたのセルへ移動 End If Loop: 'Doに戻る Close #1: 'ファイルを閉じる End Sub
すいません。それですと1段目のデータ2段目のデータの列が出来てしまいます。
実際には1段から6段までのデータがあり、それを縦一列にしたいのです。