- ベストアンサー
Excel VBAについて質問します
- A列のセルには単なる数値や「44+30」のようなデータが入っているものがある。' + の記号があったら、セルの先頭に = を追加して計算させて答えを表示しなさい。'マクロ実行後、A列には、数値だけが表示されることとする。
- マクロ実行前のA列のセルには、単なる数値だけでなく、「44+30」のような計算式が入っていることがあります。マクロを実行すると、セルの先頭に = を追加して計算式を計算し、数値の結果を表示します。これにより、A列のセルには数値だけが表示されるようになります。
- Excel VBAでの質問です。A列のセルには、数値や「44+30」といった計算式が入っていることがあります。この場合、マクロを実行すると、セルの先頭に = を追加して計算式を計算し、結果を表示します。結果として、A列のセルには数値だけが表示されるようになります。しかし、上手く動作しない場合があります。どのように修正すれば良いでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
忠実に答えるとするとこういったところでしょうか 1:Dim objRange As Range, objSrcRange As Range 2:Set objSrcRange = Range("A1:A" & CStr(Cells(Rows.Count, 1).End(xlUp).Row)) 3:For Each objRange In objSrcRange 4: If InStr(1, objRange.Value, "+") > 0 Then 5: objRange.Formula = "=" & objRange.Text 6: End If 7:Next 8:Set objSrcRange = Nothing 質問のお題通りに+があれば頭に=をつけて数式として計算させるというマクロです。ただ、答えだけの提示ではためになりませんのでポイントを説明します。説明の為に行番号を左に振っています。 1行目は変数宣言でobjRangeが作業をするセルオブジェクトを入れるための変数、objSrcRangeが作業対象のセルオブジェクトを入れるための変数です。 2行目で作業するセルを指定しています。Cells(Rows.Count, 1).End(xlUp).Row)とありますが、mt2008さんの回答にも出てきてますね。.End()の部分がミソです。End(方向)で空白/空白でないが連続しない場所まで一気にジャンプするコマンドです。(Excelシート上でCtrlを押しながらカーソルキーの上下左右を押してみてください。それと全く同じ挙動です。)mt2008さんの場合はA1から下へ調べ、空白セルが来たところが最終データとしてますが、私の書き方は一番下(A65536)より上へ調べ、初めて空白で無い場所を最終データとする違いです。こんなプロシージャを小道具に持っておくと何かと重宝しますよ。 Public Function GetLastRow(objSheet As Worksheet, intColumn As Integer) As Long GetLastRow = objSheet.Cells(Rows.Count, intColumn).End(xlUp).Row End Function 3行目と7行目で、2行目で指定した範囲のセルの1個1個に処理を行うループを指定します(1個1個なのでFor Eachを使用します)すると1ループごとにobjRangeの中身が自動で次のターゲットへ切り替わってくれます。 4行目も重要です。InStr関数(InstrRev関数ってのもあります)を用いることによって InStr(開始位置,調べたい文字列,探したい文字) という使い方をします。見つからなかった場合は0が、見つかった場合は何番目に見つかったかという数字が返ってきます。なので見つかったことだけを知りたければ0より大きいことだけを判定すればいいわけです。ちなみにファイルのパス名から¥マークを探してファイル名とフォルダー名とに分離するのにも役に立ちます。 そして5行目が今回一番のポイントですね。Excelの値を扱うものにはValueプロパティー,Textプロパティー,Formulaプロパティーがあります。「=30*15」と打ち込まれたセルでセルの書式設定に通貨(円)が設定されているとします。Excelのシート上では計算された結果の600に通貨(円)の書式が適用され「¥600」と表示されてますよね。このセルをさっきの3個のプロパティーで読み出すと下のようになります。 Value :600 (計算された結果が取り出せます) Text :¥600 (Excelのセルに表示されたテキストそのものが取り出せます) Formula:=30*15(中に入っている数式が取り出せます) このうち、ValueとFormulaのプロパティーは値を代入することによってセルの中身を更新できます。 よって、objRange.Formula = "=" & objRange.TextはobjRangeに書かれているテキストに=をつけたものをobjRangeの数式として代入しなさいということになります。 8行目は使った変数の後片付けです。散らかしたらきちんと掃除しましょう。 問題自体は単純ですけれど解法に使う要素は内容の濃いものになっていますね。ぜひ会得してくださいね。今後いろんな場面ででてきますよ。
その他の回答 (2)
- mt2008
- ベストアンサー率52% (885/1701)
「+」以外の記号が在った場合は計算する?しない? 何でも計算してしまって良いならこんな感じ。 Evaluateでとにかく計算してます。 Sub Sample() For i = 1 To ActiveSheet.Range("A1").End(xlDown).Row Range("A" & i).Value = Evaluate(Range("A" & i).Value) Next i End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
一例です。 なお質問では「表示しなさい。」とか「表示されることとする。」などと書かないように。 多分、何かの例題をそのまま書いたのでしょうが、読む方はあまり気分がいいものではないです。 Sub test01() Dim myC As Range '変数宣言 Set myC = Range("A1") 'A1セルから開始 Do While myC.Value <> "" 'データがある限り続行 myC.NumberFormatLocal = "0_ " 'セルの書式を数値に設定 If Not IsNumeric(myC.Value) Then 'もしセルのデータが数字だけじゃないなら myC.Value = "=" & myC.Value '頭に=をつける End If Set myC = myC.Offset(1) '一つ下に移行 Loop '繰り返す Set myC = Nothing End Sub
お礼
私の不注意です…
お礼
回答ありがとうございます! 『+』以外の記号は計算しなくて大丈夫だと思います… わざわざありがとうございます。