最新閲覧日:

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

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


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

A 回答 (12件中1~10件)

シートを変えれば、何もマクロを使用することなく、


関数のみで出来ます。

シート2で


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

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

尚、行・列の始点・終点は希望に合うように読み替えて下さい。
    • good
    • 0
この回答へのお礼

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

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

ありがとうございました。

お礼日時:2001/05/09 09:40

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
    • good
    • 0
この回答へのお礼

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

「こうすれば、こうなる」ではなく「これはこのようにする」の順になりますが


日刊メールマガジン【エクセル技道場】が非常にお薦めです。
メールマガジンとして申し込まなくても読めますよ!

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

マウスよりキーボードで操作するほうが早くなりますよ。

参考URL:http://www2.odn.ne.jp/excel/waza/
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/05/09 09:32

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



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


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が使えるとずいぶん便利になります。是非がんばって下さい。
    • good
    • 0
この回答へのお礼

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

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

これからも、また丁寧に教えてください。よろしくお願いします。

お礼日時:2001/05/09 09:30

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



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

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

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

お礼日時:2001/05/08 16:55

コピーっといっても、カット&ペーストではなく、マウスのドラッグ操作で簡単に出来ます。


選択したセルが以下のような形になっていると思います。

┏┓
┗・

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

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

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

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

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

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

以前のプログラムと大差はありませんので頑張ってみてください。
    • good
    • 0
この回答へのお礼

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

128yenさんこんにちは


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

マクロは、前回教えてgooで質問したときに知りました。ご丁寧にありがとうございました。
でも、私は肝心のプログラムがさっぱりわからなくて。。。私のまわりにいる人たちはさらにわからないみたいで。。。ということで、教えてgooで質問してます。。。

これからも、この機能は使っていかないとダメだと思うので、勉強をしてみたいのですが、他の仕事がかなりあって大変なのです。。。(これって甘えかな?)
でも、いつかはVisual Basicの先生と呼ばれるぐらいになりたいですね。

お礼日時:2001/05/08 16:17

あ、一部訂正・・・



sheet2のA2セルに「=sheet1.A2/$A$1」 を
sheet2のA2セルに「=sheet1.A2/A$1」 としてください。
    • good
    • 0

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



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

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

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

あとは、セルの書式設定で、小数点以下の有効桁数を決めれば、ご期待している答えが出てくると思います。
    • good
    • 0
この回答へのお礼

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

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

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

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

ちなみに、今は前回教えていただいたプログラムを変形してやってるのですが、Visual Basicに関する知識はゼロなので、かなり苦戦してます。

お礼日時:2001/05/08 16:07

関数で処理可能だと思います。


例えば例題のようであれば、変換後の列を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)」と入力すれば出来上がりです。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/05/08 16:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ