- ベストアンサー
EXCELでのデータ整理
縦に長いデータ列があり、その先頭の行には文字が入ってます。 その後に数値が縦にズラッと並んでいます。 この縦に並んだデータ列を一括で規格化したいと思ってます。 (できれば列の最後に、最大値を残したいです。) あまりプログラムとかわからないので、よろしくお願いします。 こんな感じになればいいなぁ~と思ってます。 ↓ A B C(←EXCELの列番号) _______ a b c 4 1 5 4 4 0 2 2 4 0 1 2 ↓変換後 A B C(←EXCELの列番号) _______ 1.0 0.25 1.0 1.0 1.00 0.0 0.5 0.50 0.8 0.0 0.25 0.4 4 4 5 (←それぞれの列の最大値) 私もVisual Basicを使って頑張ってみたいと思ってます。 Visual Basicはやったことがないので、、、helpを見ればできるのでしょうか?。。。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
Helpで、Rangeを見てみると・・・ごちゃごちゃと書かれていますが、結局のところ 指定シートのセルの情報を持ってくるんですね。 Set myRange = Worksheets("Sheet1").Range("A2:A11") この行で、Sheet1のA2:A11セル情報をmyRangeに一旦保存し、 max = Application.WorksheetFunction.max(myRange) この行で最大値を求め、変数maxに代入しています。 <余談ですが、Setは省略可です。実はmax = Applicationの頭にも本来であればSetがあります。> Worksheets、Application、WorksheetFunction 以下は、プログラムの一例です。(最大値の出力は削ってあります。また、体裁を良くする為に左にわざと全角スペースが入っています) Sub DataConv() Dim ii As Long Dim jj As Long Dim ClmMax As Double '各列毎に最大値を求め、その最大値との割合を計算する For ii = 1 To 256 '最大値を求める ClmMax = 0 For jj = 2 To 65536 'データが存在しない場合は終了 If IsEmpty(Sheet1.Cells(jj, ii)) Then Exit For End If If Sheet1.Cells(jj, ii) > ClmMax Then ClmMax = Sheet1.Cells(jj, ii) End If Next jj '求めた最大値が0以外であれば、求めた最大値から、指定データの割合を計算 If ClmMax <> 0 Then For jj = 2 To 65536 'データが存在しない場合は終了 If IsEmpty(Sheet1.Cells(jj, ii)) Then Exit For End If Sheet2.Cells(jj, ii) = Sheet1.Cells(jj, ii) / ClmMax Next jj End If Next ii End Sub
その他の回答 (11)
- mnabe
- ベストアンサー率33% (427/1283)
Visual Basicとは、ExcelのVBAの事を差していると判断して... HELPを見ながら出来ると思います。 ってよりも、最初は簡単な書籍を買って来て覚えるのが良いと思いますが、最終的にはHELPを見ながら作るしか方法はありません。
お礼
VBAのことです。。。ところでVBAのAは何の略なんでしょうか? ちなみに、前回Don ChaさんにVBAのプログラムを教えていただいただけで、それ以外ではVisual Basicは見たことも触ったこともありません。もちろんプログラムの構造もさっぱりわかりません。 ど素人なので、、、helpを見てもちょっと意味がわからないことだらけです。。。 みなさんのようにvisual Basicに強くなりたいです(いつか。。。100年後ぐらい?)
- 1
- 2
お礼
Rangeの説明を丁寧にしていただいてありがとうございました。 あのあと、don chaさんから以前教えていただいたプログラムとblueoakさんの書き込みを参考にして自分でプログラムを作ってみました。 Sub DataSort() Dim max As Double Dim OpLn As Long Dim OpCl As Long Dim ii As Long Dim jj As Long Dim aa As Long Dim bb As Long OpLn = 8 'プログラムの開始する行(固定) OpCl = 2 'プログラムの開始する列(固定) bb = 20 'プログラムの終了する行(最終行(一番下)の行番号) aa = 3 'プログラムの終了する列(測定点の数) max = 0 For jj = OpCl To aa For ii = OpLn To bb If max < Worksheets(1).Cells(ii, jj) Then max = Worksheets(1).Cells(ii, jj) Next ii For ii = OpLn To bb Sheet2.Cells(ii - OpLn + 1, jj) = Sheet1.Cells(ii, jj) / max 'それぞれの値を規格化(ただし文字の分をSheet2では詰めるようにしている) Next ii max = 0 Next jj For ii = OpLn To bb Sheet2.Cells(ii - OpLn + 1, 1) = Sheet1.Cells(ii, 1) 'X軸の値を1列に挿入するため Next ii End Sub こんな感じのプログラムでなんとか動きました。Forの使い方が適当なのですが、動いたのでOKということで。。。 プログラムが出来た時の喜びは、自分にしか味わえませんね。 またEXCELで何かプログラムが必要になることがありましたら、またよろしくお願いします。