- ベストアンサー
ある列の値を1千倍にする、マクロを教えてください。
対象となる、セルは、Sheet1のB1:B1000とSheet2のB1:B255です。 このセルの値を1千倍(*1000)にしたいのです。 計算をおこなわない条件が四つあります。それを下に書きます。 1 未入力("")のセル。 2 文字列(計算してエラーの出る)のセル。 3 数式の書いてあるセル。 4 セルに色のついている(セルA1と塗りつぶしの色が違う)セル。 これは、ある会社の株価が、1千倍になる(株数は千分の一になる)ので、その過去のデータを変えたいのです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 以下で出来ます。 対象となるセル範囲は適当に変えて下さい。 Sub Macro() Dim i As Long Dim A1Color As Long 'A1の色を取得する A1Color = Range("A1").Interior.ColorIndex For i = 1 To 1000 If IsNumeric(Cells(i, 2).FormulaR1C1) Then If Cells(i, 2).Interior.ColorIndex = A1Color Then Cells(i, 2).Value = Cells(i, 2).Value * 1000 End If End If Next i End Sub (ちょっと解説) FormulaR1C1プロパティを参照すると、セルに数式が入っていればそれを取得し("=RC[-1]*100"とか)、数式が入っていない場合は、セルの値をそのまま取得する。 従って、数値認識出来るかどうかを確認するIsNumeric関数に入れると、数式が入っている場合はFalseを返す。(ちなみに、未入力("")の場合もFalseを返す。) で、2つ目のIf文で色を判定している。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>If IsEmpty(c) = True Then x = x & 3 これは式の意味がわかりませんでした。 変数が初期化されたかどうかを調べ、結果をブール値で返します。なんのこっちゃ!! --->セルcがEmptyであればTrueになるわけですから、その時エラーコードを累積している変数xに、この場合のエラーコード3を加えているのです。 >変数が初期化されたかどうかを調べ、結果をブール値で返します。なんのこっちゃ --->「セルが初期化されたかどうか」というよりも、「何も入力されてなければ」を聞いています。=""と同じでダブって入るかもしれません。そのほかDeleteキーで消した時も、この状態(Empty)になると思います。 >If c.Interior.ColorIndex <> -4142 Then x = x & 5 の「-4142」は、"塗りつぶし無し"だと思いますが --->普通の色なしセルでMsgBox range("a1").Interior.ColorIndexが-4142になるので 使っただけです。
お礼
何度も教えていただき、ありがとうございます。 自分の無知を、思い切りさらしてしまいました。
- imogasi
- ベストアンサー率27% (4737/17069)
Sub test01() Dim c As Range For i = 1 To 9 x = "" Set c = Cells(i, 1) If c = "" Then x = x & 1 If c.HasFormula Then x = x & 2 If IsEmpty(c) = True Then x = x & 3 If IsNumeric(c) = False Then x = x & 4 If c.Interior.ColorIndex <> -4142 Then x = x & 5 c.Offset(0, 1) = x If x = "" Then c.Offset(0, 2) = 1000 * (c.Value) End If Next i End Sub (1)本番ではFor i = 1 To 9の9は最下行の行番号を入れてください。 d=InputBox("最下行?) For i = 1 To dとしても良い。 (2)テストの納得のために、B列にエラーコードを出しています。1と3は同じかもしれない。 (3)1000倍の値はC列に出していますが、 c.Offset(0, 2) の2を適当に変えてください。 (4)色はセルの背景色を対象とし、未設定のコード 以外を聞いています。 (4)テスト的に対象データの入っている列をSheet2のA列にコピーし、全データでテストし、エラーコードを見て、洩れ・余分があれば補足してください。再考します。 (テストデータ) 135 (セル地ブルー) a 4 (文字入力) 12 12000 23 5 (セル地赤) 13 (入力なし) 135 2 (式=B1) 13 (入力なし) 12 12000 (字体黄色) 1344 1344000
お礼
回答、ありがとうございます。 If c.Interior.ColorIndex <> -4142 Then x = x & 5 の「-4142」は、"塗りつぶし無し"だと思いますが、勉強になります。 If IsEmpty(c) = True Then x = x & 3 これは式の意味がわかりませんでした。 変数が初期化されたかどうかを調べ、結果をブール値で返します。なんのこっちゃ!! 他も色々勉強になりました。 動作は、うまくいきますが、今回は、NO1の方のものを使いたいと思います。
- vbafriend
- ベストアンサー率47% (17/36)
初めまして。#1さんのご回答でお解りになったのでしたらよろしいのですが、もしお解りにならない時には、コピー&ペーストするだけで貴方様の思い通りの動作をするサンプルマクロを汲んでみたいと思います。ご希望の節は、次の内容を教えて下さい。 ・千倍するデータが入力されているセル番地 ・千倍した答えを表示させるセル番地 お手数をおかけいたしますが、よろしくお願いいたします。
お礼
質問を見てもらって、ありがとうございます。 今回は、NO1の方の回答で解決しました。 また、何か有りましたら、よろしくお願いします。
お礼
回答、ありがとうございます。 完璧に、私の思ったとおりの動作でした。。 解説もありがとうございます。