• ベストアンサー

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

  • 128yen
  • お礼率92% (513/553)

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

  • ベストアンサー
  • 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

  • Excelのデータを書き換えるには

    Excelのデータを書き換えるには、たとえば、縦C列の文字で(空港)だけのデーターを残したいのですが、同時に横の2.5.8.9........................番のABのデーターも一緒に残せるのでしょうか。うまく説明出来ませんが、2A(住所)2B(電話番号)2C(空港) 5A(住所)5B(電話番号)5C(空港) 1A(住所)1B(電話番号)1C(スタジアム)3A(住所)3B(電話番号)3C(ジャイアンツ) 縦C列に(空港)がある横2.5.8.9......のデーターだけ残したいのです。宜しくお願いします。

  • エクセルの住所録データから郵便番号を引き出す方法はありますか?

    エクセルの住所録データから郵便番号を引き出す方法はありますか? A列に氏名B列に住所C列に電話番号が入力されています。 できればB列に郵便番号を一括変換で入力をしたいのですが・・・ エクセルで不可能であればフリーソフトでそのようなものがあればありがたいのですが・・・ よろしくお願いします。

  • エクセルのデータのラップ

    エクセル2003です。 5万件近くあるデータベースにかなりの数重複したデータが入っており、データ(行)を抹消したいのですが、何かいい方法はないでしょうか? 列は、6列程度で、A列は年月、B列は番号の様な文字列(先頭がゼロで始まる同じ桁数の数字群)、C~Eは文字列、F~Gは年月日です。 並べ替えて、手作業で地道に抹消していくぐらいしか思いつきませんので、いい方法がございましたら、教えて下さい。

  • EXCEL データの移動作業について

    OCRでデータを読み込み、エクセルに送って表にする作業をしています。取り込み方が難しく、エクセルに情報を送った後、そのデータを違うセルにドラッグで移動するという作業が必要になっています。すごく手間がかかるし、データは大量にあるので何かの機能を使って作業を短縮できないかと思ったのですが、教科書を見てもアイデアが浮かびません。何かよい案をご存知でしたら教えていただけませんでしょうか。 作業内容:例 Aの列に来るデータ、Bの列に来るデータ、Cの列に来るデータが順番にAの列に一列に並んでしまいます。これをそれぞれの列に、行がずれないように移動します。 *取り込んだときは、全てAの列に縦一列で A1 A2 A3 B1 B2 B3 C1 C2 C3 A4 A5 A6・・・(どんどん続く)というふうに並んでいます。 *作業後は、 A1B1C1 A2B2C2 A3B3C3 A4B4C4 A5B5C5・・・というふうに並べ替えたいんです。 わかりにくくてすみません。宜しくお願いします。

  • 入力された整理番号の最小値から最大値までを通し番号にしてデーターを振り分ける

     初めまして、よろしくお願いします。  セル上にランダムに整理番号をA列に、そのデーターをB列に順に乗せていきます。 例)     A    B    C     1   3   100 2   5    50 3   2    10 4   9     1 5   7    20 6 7 8 9 10 11  これを任意の場所(別シート)に     A    B    C 1 2   2    10 3   3   100 4   4     0 5   5    50 6   6     0 7   7    20 8   8     0 9   9     1 10 11 12  となる様な表を作りたいと思います。A列に入力された整理番号の最小値から最大値まで、入力されなかった番号まで(ここでは4,6,8)自動で通し番号となるよう表示し、B列のデーターを振り分けられる関数をよろしくお願いします。

  • excelでのデータ整理について。

    こんにちわ。題名にある通り、excelのデータ整理に関して質問があり、投稿させてもらいます。二つのシートにあるデータを以下のように一つにまとめたいのですが、データの数が違う点などで困っています。簡単に書くと下のようにまとめたいです。 シート1       シート2        シート3 (1) A         (1)          (1) A (2) B        (1)         (1)A (3) C        (2)          (2)B            (3)          (3)C            (3)         (3)C            (3)          (3)C (数字)は一列目の値で、アルファベットは二列目の値です。シート1とシート2を合わせてシート3のようにくっつけたいのですが、両方のデータ数が異なる為、手間取っています。なにか、方法等はあるのでしょうか。 皆さんのアドバイスを受けたく、投稿させていただきました。何卒、よろしくお願いします。

  • エクセルのデータ加工

    エクセルのセルで、縦に1行目名前A、2行目住所A、3行目電話番号A、4行目名前B、5行目住所B、6行目電話番号B・・・、という具合に並んでいるデータを横に1列目1行目名前A、1列目2行目名前B、2列目の1行目住所A、2列目の2行目住所B、3列目の1行目電話番号A、3列目の2行目電話番号B、という風に加工したいのですが、一つ一つセルを移動するのではなく、なにか良い方法はありませんでしょうか?ちなみにデータは1000件ほどあるのですが。

  • EXCEL データをレコード化するには

    Excelのデータについて教えてください 1枚目のシートに 管理番号:氏名:住所:電話番号の4つのデータがそれぞれ別のセルに入ってるデータが100件あります。 (Aの列:管理番号 Bの列:名前 Cの列:氏名 Dの列:電話番号) これを、2枚目のシートで利用したいのですが、 Aの列の管理番号を入力したら、その列のデータが表示されるように したいです。Wordの差込のような感じです。 =(Sheet1!$B3)これだと、1つのデータしか出ませんよね。 すべてのデータの送り状を作成したいと思っています。 VBAとかでないとできないのでしょうか。 よろしくお願いいたします。

  • エクセルで縦列を横行にするには?

    エクセル2007を使っています。 縦:A1列に日付があり、B1列にデータがあります。 これをC1行にA1列の日付、C2行にB1列のデータというように 縦のものを横に変更したいのですが、それぞれを参照するようにする他に、 どのようにしたらいいのでしょうか?

  • Excel 二つの表を用いたデータ整理

    かなり困っています。 (1)二つのエクセル表が存在 (2)ファイル1には↓のようにデータが並んでいます    A列  B列  C列  D列    生徒A 生徒B 生徒C 生徒D 行1 国語27 国語34 国語54 算数34 行2 数学36 家庭25 算数23 理科23 行3 理科55 理科44 理科21 英語44 行4 社会87 社会33 社会32 行5 英語54  (3)ファイル2は以下のようになっています    A列  B列  C列  D列  E列        国語  算数  理科  社会 行1 生徒A 27   36   55   87 行2 生徒B  (4)要するに、ファイル1のデータから必要な数値を抽出して ファイル2のデータに移し変えたいのですが、ファイルAの中の名称とデータ数が異なる場合があることもあり、整理はコピペしかないのかと半ばあきらめています。 とはいえデータの数は4000…正直なきたいです…何かいい方法はありませんか?

専門家に質問してみよう