-PR-
解決済み

EXCELでのデータ整理

  • 困ってます
  • 質問No.73120
  • 閲覧数1588
  • ありがとう数14
  • 気になる数0
  • 回答数12
  • コメント数0

お礼率 92% (513/553)

縦に長いデータ列があり、その先頭の行には文字が入ってます。
その後に数値が縦にズラッと並んでいます。
この縦に並んだデータ列を一括で規格化したいと思ってます。
(できれば列の最後に、最大値を残したいです。)
あまりプログラムとかわからないので、よろしくお願いします。

こんな感じになればいいなぁ~と思ってます。


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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.11
レベル11

ベストアンサー率 34% (139/407)

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

お礼率 92% (513/553)

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で何かプログラムが必要になることがありましたら、またよろしくお願いします。
投稿日時 - 2001-05-09 09:37:24
-PR-
-PR-

その他の回答 (全11件)

  • 回答No.1
レベル13

ベストアンサー率 33% (427/1283)

Visual Basicとは、ExcelのVBAの事を差していると判断して...

HELPを見ながら出来ると思います。
 ってよりも、最初は簡単な書籍を買って来て覚えるのが良いと思いますが、最終的にはHELPを見ながら作るしか方法はありません。
お礼コメント
128yen

お礼率 92% (513/553)

VBAのことです。。。ところでVBAのAは何の略なんでしょうか?

ちなみに、前回Don ChaさんにVBAのプログラムを教えていただいただけで、それ以外ではVisual Basicは見たことも触ったこともありません。もちろんプログラムの構造もさっぱりわかりません。
ど素人なので、、、helpを見てもちょっと意味がわからないことだらけです。。。

みなさんのようにvisual Basicに強くなりたいです(いつか。。。100年後ぐらい?)
投稿日時 - 2001-05-08 16:11:29
  • 回答No.12
レベル12

ベストアンサー率 18% (175/970)

シートを変えれば、何もマクロを使用することなく、
関数のみで出来ます。

シート2で


最大値は MAX(A2:A5)・・・A2~A5の最大値
 ただしsheet2に記載するので
Sheet2の A6に
 =MAX(Sheet1!A2:Sheet1!A5)
A2~A5は
 =Sheet1!A2/$A$6 ・・・(絶対セル参照)

後は、B、C行にコピーするだけです。

尚、行・列の始点・終点は希望に合うように読み替えて下さい。
お礼コメント
128yen

お礼率 92% (513/553)

コピー&ペーストをしてると日が暮れそうなので。。。
ちょっとでも楽をしたかったんですよね。(でも、プログラムを作るのにかなり時間がかかってしまって、コピー&ペーストの方が早くデータ整理が終わっていたかもしれません。。。)

MAX(Sheet1!A2:Sheet1!A5)の記述だけでSheet1からSheet2へもってくることができるんですね。
いろいろ勉強になります。(どこかにメモしておかないと)

ありがとうございました。
投稿日時 - 2001-05-09 09:40:36
  • 回答No.8
レベル14

ベストアンサー率 33% (1403/4213)

データが入力されている範囲の、端への移動方法をご存知でしょうか?

Ctrlキーを押したまま矢印キーを押すとその端まで移動できます。
さらにCtrlキーとShiftキーを押したまま矢印キーを押すとその間すべてが選択できます。

Ctrlキー+HomeキーでセルA1へ、Ctrlキー+Endキーで使用されている最大のセルへ移動できます。
これを知っていると件数の多いシートでの作業がずいぶんと楽になりますよ。
お礼コメント
128yen

お礼率 92% (513/553)

おおおっ、すごいですね。今まで横とか下にある棒をひっぱったりしてやってました。。。
これを覚えるとほんと楽にできそうですね。
EXCELの場合何かほかにキーボードを使って楽に出来ることとかってあるんですか?
投稿日時 - 2001-05-08 16:55:56
  • 回答No.7
レベル11

ベストアンサー率 34% (139/407)

コピーっといっても、カット&ペーストではなく、マウスのドラッグ操作で簡単に出来ます。
選択したセルが以下のような形になっていると思います。

┏┓
┗・

で、右下の「・」の部分にマウスカーソルを合わせると、マウスカーソル自体が「+」の状態になります。
このまま左ボタンを押したまま右方向へとマウスを動かすと、グレーの選択線が出てきますので、そのままIV列まで持って行きます。(IVまでいったら、ボタンを離す)

同じように縦方向も可能ですし、複数選択された状態でも可能です。

-----
また、VBAの勉強がてらということであれば、プログラムを組むのはいいことだと思います。

ただ、処理にはめちゃくちゃ時間が掛かると思います(^^;

基本的には以下のような考えですかね。

1.指定列の2行目以降~65535行までの値をチェックし、最大値を求める。
2.求めた最大値で、指定列のデータを割った値をシート2へ記述していく。
3.1列目から256列目までを1と2の処理を繰り返す。

以前のプログラムと大差はありませんので頑張ってみてください。
お礼コメント
128yen

お礼率 92% (513/553)

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
投稿日時 - 2001-05-08 16:52:47
  • 回答No.10
レベル14

ベストアンサー率 33% (1403/4213)

「こうすれば、こうなる」ではなく「これはこのようにする」の順になりますが
日刊メールマガジン【エクセル技道場】が非常にお薦めです。
メールマガジンとして申し込まなくても読めますよ!

もしいろいろな操作をマウスでメニュー操作なさってるのなら、それぞれの処理の
右側にあるショートカットキー(アルファベット・数字の下にアンダーライン)を
Altキーとの組み合わせで実行できますからお試しください。

マウスよりキーボードで操作するほうが早くなりますよ。
お礼コメント
128yen

お礼率 92% (513/553)

すごいたくさんのことが書いてありますね。さっそくお気に入りに登録しておきました。
コピーとかペーストは、キーボードからやってるんですが、それ以外はほとんど使ったことがないので。。。
とても役立ちそうな気がしました。ありがとうございました。
投稿日時 - 2001-05-09 09:32:45
  • 回答No.9
レベル5

ベストアンサー率 50% (2/4)

 えーっ、どこまで詳しい回答が必要なのか分からないので、一番わかりやすいマクロはこんなもんでしょうか、、、

 計算対象は最初のシートで、一列目には、ずうっと最後までブランクが無いものとします。


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

お礼率 92% (513/553)

ご丁寧な回答ありがとうございました。

このプログラムだと、同じSheetに上書きしてしまうので、元のデータが消えてしまうので、実際自分でプログラムを組んでみました。blueoakさんのプログラムを参考にさせて貰い、なんとか組むことができました。
IFとかの使い方を覚えることができてよかったです。

これからも、また丁寧に教えてください。よろしくお願いします。
投稿日時 - 2001-05-09 09:30:39
  • 回答No.2
レベル14

ベストアンサー率 33% (1403/4213)

128yenさんがなさりたいのは、
1.列Aのソート、列Bのソート、列Cのソート
2.小数部桁数をそろえる
の2点なんですか?

マクロで対応できそうな気がしますけど?

VB(この場合はVBA)の勉強も、EXCEL上の操作をマクロで
記録してみる方法があります。
ただ、記述が「くどい」傾向がありますので文法書は必要でしょう。
お礼コメント
128yen

お礼率 92% (513/553)

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

マクロとかよくわかっていないので、、、文法書は必須かもしれません。。。
投稿日時 - 2001-05-08 15:57:10
  • 回答No.3
レベル9

ベストアンサー率 35% (42/120)

関数で処理可能だと思います。
例えば例題のようであれば、変換後の列を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

お礼率 92% (513/553)

「=A2*.25」とかの意味がちょっとわかりません。
小数点の桁数を決定してるのでしょうか?

EXCEL内で、MAX、割り算などの関数をコピー&ペーストで使うのは何度もやっているのでわかるのですが、今回のデータは列の数がかなり多いのです。(データ数もかなりある)。。。
そこで、コピー&ペーストではかなり時間がかかってしまうので、Visual Basicで出来ればいいと思っていたもので。。。
説明不足ですみません。。。
投稿日時 - 2001-05-08 16:01:39
  • 回答No.4
レベル11

ベストアンサー率 34% (139/407)

VBAの勉強は、書籍やHPなどに公開されているプログラムを見て一つ一つの命令をHelpで調べていくと、どういうことをやっているのか判ると思います。

また、ご質問の内容であれば、プログラムを組むほどではないです。
sheet1にデータがあるものとして、sheet2に変換したデータを表示するものとすれば、以下の手順で行えば変換が出来ます。(ちょっと仕様の変更で最大値を最初の行に持ってきます。)

sheet2のA1セルに「=MAX(sheet1.A1:A65535)」
sheet2のA2セルに「=sheet1.A2/$A$1」

あとは、A1セルは横一列にコピーし、A2セルは横と縦にコピーします。(sheet1の最大セルまでの部分)

あとは、セルの書式設定で、小数点以下の有効桁数を決めれば、ご期待している答えが出てくると思います。
お礼コメント
128yen

お礼率 92% (513/553)

この前はご丁寧にありがとうございました。

今回は前回のデータ整理の続きで、数あるデータを規格化することが目的です。
don chaさんの方法は私でもできるのですが、データ数が膨大なもので、列数はIV列(256列)もあり、さらにこのデータが縦にずらっとならんでいます。

1つ1つコピー&ペーストでやっていけばいいのですが、時間がかなりかかりそうで。。。

前回のように、規格化したデータをSheet1からSheet2に移すようなプログラムはできないでしょうか?最大値は無視してかまいませんので、、、よろしくお願いします。

ちなみに、今は前回教えていただいたプログラムを変形してやってるのですが、Visual Basicに関する知識はゼロなので、かなり苦戦してます。
投稿日時 - 2001-05-08 16:07:07
  • 回答No.5
レベル11

ベストアンサー率 34% (139/407)

あ、一部訂正・・・

sheet2のA2セルに「=sheet1.A2/$A$1」 を
sheet2のA2セルに「=sheet1.A2/A$1」 としてください。
11件中 1~10件目を表示
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ