• ベストアンサー

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を見ればできるのでしょうか?。。。

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

  • ベストアンサー
  • don_cha
  • ベストアンサー率34% (139/407)
回答No.11

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

128yen
質問者

お礼

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で何かプログラムが必要になることがありましたら、またよろしくお願いします。

その他の回答 (11)

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

Visual Basicとは、ExcelのVBAの事を差していると判断して... HELPを見ながら出来ると思います。  ってよりも、最初は簡単な書籍を買って来て覚えるのが良いと思いますが、最終的にはHELPを見ながら作るしか方法はありません。

128yen
質問者

お礼

VBAのことです。。。ところでVBAのAは何の略なんでしょうか? ちなみに、前回Don ChaさんにVBAのプログラムを教えていただいただけで、それ以外ではVisual Basicは見たことも触ったこともありません。もちろんプログラムの構造もさっぱりわかりません。 ど素人なので、、、helpを見てもちょっと意味がわからないことだらけです。。。 みなさんのようにvisual Basicに強くなりたいです(いつか。。。100年後ぐらい?)

関連するQ&A