プロが教える店舗&オフィスのセキュリティ対策術

対象となる、セルは、Sheet1のB1:B1000とSheet2のB1:B255です。

このセルの値を1千倍(*1000)にしたいのです。

計算をおこなわない条件が四つあります。それを下に書きます。
 1 未入力("")のセル。
 2 文字列(計算してエラーの出る)のセル。
 3 数式の書いてあるセル。
 4 セルに色のついている(セルA1と塗りつぶしの色が違う)セル。

これは、ある会社の株価が、1千倍になる(株数は千分の一になる)ので、その過去のデータを変えたいのです。

よろしくお願いします。

A 回答 (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文で色を判定している。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

完璧に、私の思ったとおりの動作でした。。

解説もありがとうございます。

お礼日時:2002/11/27 15:24

>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になるので
使っただけです。
    • good
    • 1
この回答へのお礼

何度も教えていただき、ありがとうございます。

自分の無知を、思い切りさらしてしまいました。

お礼日時:2002/11/27 20:27

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        (セル地ブルー) 
a4    (文字入力)
1212000
235    (セル地赤)
13    (入力なし) 
1352    (式=B1) 
13     (入力なし)
1212000  (字体黄色)
13441344000
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

If c.Interior.ColorIndex <> -4142 Then x = x & 5 の「-4142」は、"塗りつぶし無し"だと思いますが、勉強になります。
If IsEmpty(c) = True Then x = x & 3 これは式の意味がわかりませんでした。
変数が初期化されたかどうかを調べ、結果をブール値で返します。なんのこっちゃ!!
他も色々勉強になりました。

動作は、うまくいきますが、今回は、NO1の方のものを使いたいと思います。

お礼日時:2002/11/27 16:59

初めまして。

#1さんのご回答でお解りになったのでしたらよろしいのですが、もしお解りにならない時には、コピー&ペーストするだけで貴方様の思い通りの動作をするサンプルマクロを汲んでみたいと思います。ご希望の節は、次の内容を教えて下さい。

・千倍するデータが入力されているセル番地
・千倍した答えを表示させるセル番地

お手数をおかけいたしますが、よろしくお願いいたします。
    • good
    • 0
この回答へのお礼

質問を見てもらって、ありがとうございます。

今回は、NO1の方の回答で解決しました。

また、何か有りましたら、よろしくお願いします。

お礼日時:2002/11/27 15:28

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