
VBA(多くの数値データの最小値5つを格納する方法)
現在テキストファイルの数値データを取り出し最小値5つを書き出す動作をVBAで行うつもりでいます。
例 5
9
33
11
1
0.3
0.02
・
・
・
・
といった形の数値データ行がテキストファイルに存在します。
今現在すべての数値データを格納してエクセルに書き出しそれを並び替え最小値5つ(0を除く)を見て作業を行っております。
この作業をより効率化するために、VBAを用いて0を除いた最小値5つをエクセルシートに書き出すようにしたいのですが、VBAの知識が足らず対策が思い浮かびません。
・VBAで行いたいこと(わからない部分)
格納するデータを5つに設定して、数値データを順次読み込み最終的に数値データ群の最小値5つ(0を除く)を配列に格納している状態にしたい。
初歩的かもしれませんが、ご回答お願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こんばんは
>今現在すべての数値データを格納してエクセルに書き出しそれを並び替え最小値5つ(0を除く)を見て作業を行っております。
>この作業をより効率化するために、VBAを用いて0を除いた最小値5つをエクセルシートに書き出すようにしたいのですが、VBAの知識が足らず対策が思い浮かびません。
Excel自身が優れた能力を持っているので、VBAでもExcelの力を借りることをお勧めします。
以下のマクロはご質問の手順に近い形で組んであります。
元のデータは、
1.マクロのあるエクセルファイルと同じフォルダにある(サブフォルダでは×)
2.元データはテキスト形式で、ファイル名が「元データ.txt」
であると想定しています。
Sub 抽出()
'準備
ThisWorkbook.Activate
Worksheets(1).Select
Cells.Delete
[A1].Select
'コピー
Workbooks.Open ThisWorkbook.Path & "\元データ.txt", ReadOnly:=True '元データを開く
[A:A].Replace What:="0", Replacement:="", LookAt:=xlWhole 'ゼロを除去
[A:A].Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo '昇順で並べ替え
[A1:A5].Copy 'クリップボードにコピー
'ペースト
ThisWorkbook.Activate
ActiveSheet.Paste
End Sub
No.3
- 回答日時:
こんな方法もあります。
ご参考まで。対象のテキストファイルを、C:\text.txt とします。
テキストファイルの構造が分かりませんが、最初のフィールドが対象データだとします。
Sub test()
Dim CN As Object
Dim RS As Object
Dim mySQL As String
Set CN = CreateObject("ADODB.Connection")
CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\;" & _
"Extended Properties='Text;HDR=NO'"
mySQL = "SELECT TOP 5 mytable.F1 FROM test.txt as mytable WHERE mytable.F1<>0 ORDER BY mytable.F1;"
Set RS = CN.Execute(mySQL)
With ActiveSheet
.Range("A1").CopyFromRecordset RS
End With
Set RS = Nothing
Set CN = Nothing
End Sub
参考URL:http://home.att.ne.jp/zeta/gen/excel/c04p47.htm
No.2
- 回答日時:
最小や最大の問題は、どんな優れたアルゴリズムでも、データを最後まで1回は読まないとなりません。
それ以上のアルゴリズムはありません。
(1)小さいものから順(昇順)にソートをして、最後データを加えてソートして(ソートが終わって)、最も小さいもの(先頭)から5つ採る。
(2)5つのデータを保存する変数をもうけ、変数に1-5までの大小順序を固定して考え、(1つ前までのデータでの1番席から5番席)データを1つ読んだとき、何番席に座るべきかチェックする。直前の小さいものからの5番よりも大きい場合は捨てる。1番から5番までの間に入る場合は、それ以下をずらし(今の5番目は捨てて)いく。
この方式で最終データを処理し終わると、5つの席(変数)に望みの数が残る。
最小値を1つ求めるアルゴリズム(やったことありますか)の小さい方から5つ版です。
ソートプログラムがレディメードである場合(エクセルのシートデータのソートや、オフコン・大型コンピュタでのソート・マージユティティ)はそれを使うと確実でかつ速い(アルゴリズムに、完了を早くする様々なプロの工夫があるようだから)。
ソートプログラムを自作しないとならない状態なら、(2)の方が良いかも。ソートプログラムの自作は、アルゴリズムによってはプログラムが初心者には難しいと思うし、多様なデータでのテストが難しく、テスト不足でプログラムエラーがデバッグできてないことも起こりえる。
業務データなどで自作の結果にエラーが発見されると、大責任問題になりかねない。恐ろしいことです。
No.1
- 回答日時:
一応以下の処理でMinDataに最小値を求めることができると思います。
※ファイルのフルパス名は修正してください。
Sub 最小値を求める()
Const 取得件数 = 5
Dim I As Integer
Dim InData As Double
Dim MinData(1 To 取得件数) As Double
Open "D:\TESTDATA.txt" For Input As #1
Do While Not (EOF(1))
Input #1, InData
Select Case True
Case InData = 0
Case WorksheetFunction.Min(MinData) = 0
For I = 1 To 取得件数
If MinData(I) = 0 Then
MinData(I) = InData
Exit For
End If
Next I
Case WorksheetFunction.Max(MinData) > InData
For I = 1 To 取得件数
If MinData(I) = WorksheetFunction.Max(MinData) Then
MinData(I) = InData
Exit For
End If
Next I
End Select
Loop
Close
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
ウィンドウ枠の固定を行の2箇所...
-
SetCurrentPositionに秒数を指定
-
メモ帳(テキストデータ)をExc...
-
配列の勉強をしています。使用...
-
GETはできるがPOSTができない、...
-
1列で複数行のソート後のデー...
-
平均値の計算の仕方は?
-
Googleスプレッドシートで、一...
-
UCLとLCLってなんですか?予備...
-
GridViewの行の一部を複数行にする
-
ExcelVBAでデータ不一致のもの...
-
[C言語] コメント文字列を無視...
-
マクロで同じフォルダにある画...
-
【VBA】データを入力後に,同一...
-
配列数式の解除
-
数式は残し値をクリアするマク...
-
Libre office マクロ
-
マクロを組んで作業するのは実...
-
特定のPCだけ動作しないVBAマク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
EXCELVBAでSQLserverからデータ...
-
エクセルで2つの時系列のデー...
-
ACCESS VBA インデックスが有効...
-
二分探索の平均探索回数
-
Accessで該当データにフラグを...
-
ビットシフトについて
-
Rails4 Redirect_Toで送信
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
ブレーカー落ちで壊れたりしな...
-
ActiveReportについて
-
バーコードリーダーの読込デー...
-
C# でDataTableの更新を高速化...
-
プログラミング python pandas ...
おすすめ情報