• ベストアンサー

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)

  • h_sakaki
  • ベストアンサー率18% (175/970)
回答No.12

シートを変えれば、何もマクロを使用することなく、 関数のみで出来ます。 シート2で 最大値は MAX(A2:A5)・・・A2~A5の最大値  ただしsheet2に記載するので Sheet2の A6に  =MAX(Sheet1!A2:Sheet1!A5) A2~A5は  =Sheet1!A2/$A$6 ・・・(絶対セル参照) 後は、B、C行にコピーするだけです。 尚、行・列の始点・終点は希望に合うように読み替えて下さい。

128yen
質問者

お礼

コピー&ペーストをしてると日が暮れそうなので。。。 ちょっとでも楽をしたかったんですよね。(でも、プログラムを作るのにかなり時間がかかってしまって、コピー&ペーストの方が早くデータ整理が終わっていたかもしれません。。。) MAX(Sheet1!A2:Sheet1!A5)の記述だけでSheet1からSheet2へもってくることができるんですね。 いろいろ勉強になります。(どこかにメモしておかないと) ありがとうございました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.10

「こうすれば、こうなる」ではなく「これはこのようにする」の順になりますが 日刊メールマガジン【エクセル技道場】が非常にお薦めです。 メールマガジンとして申し込まなくても読めますよ! もしいろいろな操作をマウスでメニュー操作なさってるのなら、それぞれの処理の 右側にあるショートカットキー(アルファベット・数字の下にアンダーライン)を Altキーとの組み合わせで実行できますからお試しください。 マウスよりキーボードで操作するほうが早くなりますよ。

参考URL:
http://www2.odn.ne.jp/excel/waza/
128yen
質問者

お礼

すごいたくさんのことが書いてありますね。さっそくお気に入りに登録しておきました。 コピーとかペーストは、キーボードからやってるんですが、それ以外はほとんど使ったことがないので。。。 とても役立ちそうな気がしました。ありがとうございました。

  • blueoak
  • ベストアンサー率50% (2/4)
回答No.9

 えーっ、どこまで詳しい回答が必要なのか分からないので、一番わかりやすいマクロはこんなもんでしょうか、、、  計算対象は最初のシートで、一列目には、ずうっと最後までブランクが無いものとします。 Sub sample() Dim maxvalue(3) lineposition = 2 //計算をスタートさせる行です。  Do While Worksheets(1).Cells(lineposition, 1) <> ""   //空白が無い限り、ずっと For x = 1 To 3 //計算対象は3列まで If IsNumeric(Worksheets(1).Cells(lineposition, x)) And Val(Worksheets(1).Cells(lineposition, x)) <> 0 Then   //セルが数で0じゃなかったら If maxvalue(x) < Worksheets(1).Cells(lineposition, x) Then   maxvalue(x) = Worksheets(1).Cells(lineposition, x)   //セルがmaxvalueよりおおきかったらmaxvalueにする。 Worksheets(1).Cells(lineposition, x) = Worksheets(1).Cells(lineposition, x) / 4   //この場合は、セルの数値を4で割っているだけです。 End If Next lineposition = lineposition + 1 //1行次へ Loop //空欄が現れるまで For x = 1 To 3 Worksheets(1).Cells(lineposition + 1, x) = maxvalue(x) Next  //最後+1行目に最大値をいれる。 End Sub  ちょっと難しいかも知れません。一応できる!ということで解読してみて下さい。エクセルも、VBAが使えるとずいぶん便利になります。是非がんばって下さい。

128yen
質問者

お礼

ご丁寧な回答ありがとうございました。 このプログラムだと、同じSheetに上書きしてしまうので、元のデータが消えてしまうので、実際自分でプログラムを組んでみました。blueoakさんのプログラムを参考にさせて貰い、なんとか組むことができました。 IFとかの使い方を覚えることができてよかったです。 これからも、また丁寧に教えてください。よろしくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.8

データが入力されている範囲の、端への移動方法をご存知でしょうか? Ctrlキーを押したまま矢印キーを押すとその端まで移動できます。 さらにCtrlキーとShiftキーを押したまま矢印キーを押すとその間すべてが選択できます。 Ctrlキー+HomeキーでセルA1へ、Ctrlキー+Endキーで使用されている最大のセルへ移動できます。 これを知っていると件数の多いシートでの作業がずいぶんと楽になりますよ。

128yen
質問者

お礼

おおおっ、すごいですね。今まで横とか下にある棒をひっぱったりしてやってました。。。 これを覚えるとほんと楽にできそうですね。 EXCELの場合何かほかにキーボードを使って楽に出来ることとかってあるんですか?

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

コピーっといっても、カット&ペーストではなく、マウスのドラッグ操作で簡単に出来ます。 選択したセルが以下のような形になっていると思います。 ┏┓ ┗・ で、右下の「・」の部分にマウスカーソルを合わせると、マウスカーソル自体が「+」の状態になります。 このまま左ボタンを押したまま右方向へとマウスを動かすと、グレーの選択線が出てきますので、そのままIV列まで持って行きます。(IVまでいったら、ボタンを離す) 同じように縦方向も可能ですし、複数選択された状態でも可能です。 ----- また、VBAの勉強がてらということであれば、プログラムを組むのはいいことだと思います。 ただ、処理にはめちゃくちゃ時間が掛かると思います(^^; 基本的には以下のような考えですかね。 1.指定列の2行目以降~65535行までの値をチェックし、最大値を求める。 2.求めた最大値で、指定列のデータを割った値をシート2へ記述していく。 3.1列目から256列目までを1と2の処理を繰り返す。 以前のプログラムと大差はありませんので頑張ってみてください。

128yen
質問者

お礼

helpを見ながらやって以下のプログラムが出来ました。 これは、A列のみのデータでA1に文字、A2~A11に数字が入っている場合のプログラムです。 動きました。。。(かなり嬉しいです。。。) が、Set myRangeの意味がさっぱりわからずに作ったので、これを他の列にまで拡張させたいのですが、ぜんぜんわかりません。。。 たぶん、Forを使えばいいんでしょうが、そうした場合Range("A2:A11")とかをどうすればいいんでしょうか。。。 助けてください。。。 Sub DataSort() Dim myRange As Range Dim max As Double Dim OpLn As Long Dim OpCl As Long Dim ii As Long Dim answer As Double OpLn = 2 OpCl = 1 Set myRange = Worksheets("Sheet1").Range("A2:A11") max = Application.WorksheetFunction.max(myRange) For ii = 2 To 11 Sheet2.Cells(OpLn, OpCl) = Sheet1.Cells(OpLn, OpCl) / max OpLn = OpLn + 1 Next End Sub

  • TTak
  • ベストアンサー率52% (206/389)
回答No.6

128yenさんこんにちは EXCELにはマクロの自動記録という機能があります。この機能は記録開始から記録終了までに手動で行った操作をすべてVBAのプログラム(コード)に置き換えてくれる機能です。順序としては、 [ツール]>[マクロ]>[新しいマクロの記録]>(手動操作)>[ツール]>[マクロ]>[記録終了] です。 次に、VisualBasicEditorで自動記録したコードを見ながら、キーワードを選択して[F1]キーを押すとそのヘルプがダイレクトに開きますので、そこでヘルプを参照してみましょう。最初のうちは言葉の意味がちんぷんかんぷんですが、根気よく続けていると少しずつ解ってきますよ。簡単な操作を記録してみるというのも一つの手です。  VBAの場合、自分の操作を自動でプログラムにしてみて、後からその意味を調べるという方法が習得の早道です。その中で、スピードアップや種々の条件への対応などという問題が必ず発生してきますから、そこで書籍などを使ってステップアップしましょう。  128yenさんの示された例から、まず~ データの範囲を列ごとに選択して、書式設定で表示形式から小数点以下の桁数を指定し、その列の最下段にMAX関数を使って最大値を表示させる。  ~という操作を自動記録してみてはいかがですか。

128yen
質問者

お礼

マクロは、前回教えてgooで質問したときに知りました。ご丁寧にありがとうございました。 でも、私は肝心のプログラムがさっぱりわからなくて。。。私のまわりにいる人たちはさらにわからないみたいで。。。ということで、教えてgooで質問してます。。。 これからも、この機能は使っていかないとダメだと思うので、勉強をしてみたいのですが、他の仕事がかなりあって大変なのです。。。(これって甘えかな?) でも、いつかはVisual Basicの先生と呼ばれるぐらいになりたいですね。

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

あ、一部訂正・・・ sheet2のA2セルに「=sheet1.A2/$A$1」 を sheet2のA2セルに「=sheet1.A2/A$1」 としてください。

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

VBAの勉強は、書籍やHPなどに公開されているプログラムを見て一つ一つの命令をHelpで調べていくと、どういうことをやっているのか判ると思います。 また、ご質問の内容であれば、プログラムを組むほどではないです。 sheet1にデータがあるものとして、sheet2に変換したデータを表示するものとすれば、以下の手順で行えば変換が出来ます。(ちょっと仕様の変更で最大値を最初の行に持ってきます。) sheet2のA1セルに「=MAX(sheet1.A1:A65535)」 sheet2のA2セルに「=sheet1.A2/$A$1」 あとは、A1セルは横一列にコピーし、A2セルは横と縦にコピーします。(sheet1の最大セルまでの部分) あとは、セルの書式設定で、小数点以下の有効桁数を決めれば、ご期待している答えが出てくると思います。

128yen
質問者

お礼

この前はご丁寧にありがとうございました。 今回は前回のデータ整理の続きで、数あるデータを規格化することが目的です。 don chaさんの方法は私でもできるのですが、データ数が膨大なもので、列数はIV列(256列)もあり、さらにこのデータが縦にずらっとならんでいます。 1つ1つコピー&ペーストでやっていけばいいのですが、時間がかなりかかりそうで。。。 前回のように、規格化したデータをSheet1からSheet2に移すようなプログラムはできないでしょうか?最大値は無視してかまいませんので、、、よろしくお願いします。 ちなみに、今は前回教えていただいたプログラムを変形してやってるのですが、Visual Basicに関する知識はゼロなので、かなり苦戦してます。

  • maje
  • ベストアンサー率35% (42/120)
回答No.3

関数で処理可能だと思います。 例えば例題のようであれば、変換後の列をEFG列に作るとします(どうしてもABC列にしたければ新しいシートのABC列を使います)。 1列目はabcの文字列なので2列目で、 セルE2には「=A2*.25」。セルF2には「=B2*.25」。セルG2には「=C2*.25」と入力し、E列とG列の表示形式は「0.0」、F列の表示形式は「0.00」とします。 この数式の入ったセルをドラッグするかコピーするかしてデータの入っている行まで拡張します。 最後の列には最大値をあらわす関数「MAX」を使い、縦のデータが仮に100行目まで入っていれば セルE102には「=MAX(A2:A100)」。セルF102には「=MAX(B2:B100)」。セルG102には「=MAX(C2:C100)」と入力すれば出来上がりです。

128yen
質問者

お礼

「=A2*.25」とかの意味がちょっとわかりません。 小数点の桁数を決定してるのでしょうか? EXCEL内で、MAX、割り算などの関数をコピー&ペーストで使うのは何度もやっているのでわかるのですが、今回のデータは列の数がかなり多いのです。(データ数もかなりある)。。。 そこで、コピー&ペーストではかなり時間がかかってしまうので、Visual Basicで出来ればいいと思っていたもので。。。 説明不足ですみません。。。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

128yenさんがなさりたいのは、 1.列Aのソート、列Bのソート、列Cのソート 2.小数部桁数をそろえる の2点なんですか? マクロで対応できそうな気がしますけど? VB(この場合はVBA)の勉強も、EXCEL上の操作をマクロで 記録してみる方法があります。 ただ、記述が「くどい」傾向がありますので文法書は必要でしょう。

128yen
質問者

お礼

小数点の桁数を揃える必要はありません。 とりあえず、データの規格化をしたいだけなので、1の列Aのソート、列Bのソート、列CのソートだけでOKです。ところでソートって何ですか?並べ替え? マクロとかよくわかっていないので、、、文法書は必須かもしれません。。。

関連するQ&A