こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルのセル内の「数式」の一括変更をVBAなどで行いたいです!

エクセルのセル内の「数式」の一括変更をVBAなどで行いたいです!


いま=O48*($E$8/100)となっている算式を、
=IF(ISNUMBER(O48*($E$8/100)),O48*($E$8/100),"N/A")
としたいのです。
また、このような変換を行うべきセルが数百個あり、これをボタンひとつもしくは
Ctl+aなどで行えるようにしたいのです。

式の返還は単純で、最初の式をxとすると、IF(ISNUMBER(x),x,"N/A")
と置き換えるだけなので、たとえばxという変数に今のセル内の式を代入し、それから
IF~の式の指定場所にxを入れる・・・というようなプログラミング処理ができるのでは
とかんがえ、質問しました。

よいアイデアをください!!明日までにやる必要があり困っています・・・

投稿日時 - 2010-08-14 22:42:12

QNo.6109815

すぐに回答ほしいです

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

"=O48*($E$8/100)"が固定なら,検索置換でできるが,
"O48"の部分が変わるなら,つぎのようにでもする。
参考にどうぞ。

Selectionは,Rangeなどで適当に変える。
For 文の cc = 79 To 84 は"O"から"T"までにしておいたので,
これも適当に変える。


With Selection
For cc = 79 To 84
Set c = .Find("=" & Chr(cc) & "?*($E$8/100)", LookIn:=xlFormulas)
If Not c Is Nothing Then
firstAddress = c.Address
Do
cf0 = c.Formula
cf = Mid(cf0, 2, Len(cf0) - 1)
c.Formula = "=IF(ISNUMBER(" & cf & ")," & cf & ",""N/A"")"
Set c = .FindNext(c)
If c Is Nothing Then Exit Do
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
Next
End With

投稿日時 - 2010-08-15 01:39:00

お礼

すんばらしい!有難うございました。

投稿日時 - 2011-01-07 10:13:26

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

式を1箇所だけ変えて、その変更内容を下のセルに一気に適用できます。

http://pc.nikkeibp.co.jp/article/NPC/20060215/229477/

投稿日時 - 2010-09-07 17:47:48

ANo.6

O48の部分がセルによって変わるかどうか質問に書いてないのは不十分。
固定なら置換でやれる。
ーー
セルの何処に式があるかわからないから
Sub test01()
For Each cl In Range("A1:H100")
If cl.HasFormula Then
MsgBox cl.Address & " " & cl.Formula
'処理
End If
Next
End Sub
を試しにやってごらん。Range("A1:H100")を狭い範囲でやってみて、式の在るセルを捉えることを納得してみること。本番では実情に応じてこの範囲は変える。Msgboxの行は省く。
処理の部分だが、
f = cl.Formula
f = Right(f, Len(f) - 1) '=を省く
cl.Formula = "=IF(ISNUMBER(" & f & ")," & f & ",N/A)"
で旨くいくか、やってみてください。

投稿日時 - 2010-08-15 10:22:57

こんにちは。

「明日までに」ということですので、もう遅いかな。

そのようなセルのある範囲が機械的に一斉に選択できるなら(Excelのジャンプ機能のことです)
数式そのものを変更する(特に今回のような変更)は効率的でない(変更作業ではなく、Excelの関数の使い方として)ので、該当セルに条件付き書式をかませるのが一番だと思います。

今回は条件付き書式を

・ルールの種類を選択してください → 数式を使用して、書式設定するセルを決定
・ルールの内容を編集してください → 次の式を満たす場合に値を書式設定 → =not(isnumber(この書式を適用するセルのアドレス))
・書式は セルの書式設定ダイアログで ユーザー定義 種類に 「;;;"N/A"」(かぎかっこの中だけ入力してください)

とすれば対応可能と思われます。

投稿日時 - 2010-08-15 08:36:43

ANo.3

計算式のあるセルをすべて置き換えるのでしたら

Dim ExchangeRange As Range

For Each ExchangeRange In Range("a:z")
If ExchangeRange.HasFormula = True Then
ExchangeRange.Formula = "=IF(ISNUMBER(" & Right(ExchangeRange.Formula, Len(ExchangeRange.Formula) - 1) _
& ")," & Right(ExchangeRange.Formula, Len(ExchangeRange.Formula) - 1) & ",""N/A"")"
End If
Next

こんな感じで
In Range("a:z")
のa:zを適当に変更してください。

投稿日時 - 2010-08-14 23:53:00

ANo.2

1の方が仰るとおり、規則性を見いだしてループを抜ける条件がハッキリしてればすぐに出来ますよ。

単純に全ての式を変更するだけなら、VBAでなく秀丸に張り付けて正規表現で置換すればすぐ終わります!

投稿日時 - 2010-08-14 23:13:45

ANo.1

規則性を見出すこと!
これによってループが組める

対象セルの値(.Value)="=計算式"

対象セルや計算式に組み込まれる計算対象セルを
ループで回して指定すれば
こードが短くなる



って 質問の やりたい内容がその説明だとよくわかりません!

投稿日時 - 2010-08-14 22:51:13

あなたにオススメの質問