Excel VBAについて質問します

このQ&Aのポイント
  • A列のセルには単なる数値や「44+30」のようなデータが入っているものがある。' + の記号があったら、セルの先頭に = を追加して計算させて答えを表示しなさい。'マクロ実行後、A列には、数値だけが表示されることとする。
  • マクロ実行前のA列のセルには、単なる数値だけでなく、「44+30」のような計算式が入っていることがあります。マクロを実行すると、セルの先頭に = を追加して計算式を計算し、数値の結果を表示します。これにより、A列のセルには数値だけが表示されるようになります。
  • Excel VBAでの質問です。A列のセルには、数値や「44+30」といった計算式が入っていることがあります。この場合、マクロを実行すると、セルの先頭に = を追加して計算式を計算し、結果を表示します。結果として、A列のセルには数値だけが表示されるようになります。しかし、上手く動作しない場合があります。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

excel VBAについて質問します

excel VBAについて質問します A列のセルには単なる数値や「44+30」のようなデータが入っているものがある。 ' + の記号があったら、セルの先頭に = を追加して計算させて答えを表示しなさい。 'マクロ実行後、A列には、数値だけが表示されることとする。 マクロ実行前   ⇒  マクロ実行後 22   --------------- 22 44+30 --------------- 77 35 -------------------- 35 22+11 --------------- 33 こういった感じにしたいんですがなかなか上手く行きません。

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

  • ベストアンサー
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.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)
回答No.2

「+」以外の記号が在った場合は計算する?しない? 何でも計算してしまって良いならこんな感じ。 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

keita102
質問者

お礼

回答ありがとうございます! 『+』以外の記号は計算しなくて大丈夫だと思います… わざわざありがとうございます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

一例です。 なお質問では「表示しなさい。」とか「表示されることとする。」などと書かないように。 多分、何かの例題をそのまま書いたのでしょうが、読む方はあまり気分がいいものではないです。 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

keita102
質問者

お礼

私の不注意です…

関連するQ&A

  • Excel VBAについて

    Excel VBAについて ExcelのセルA1に日付データ(yyyy/mm/dd hh:mm)が入っています。 このエクセルファイルを開いている間、セルA1の日付(時分)が更新されたらマクロを実行するようにしたいのですが、どのようにしたらよいのでしょうか。 セルA1の日付データが更新されるタイミングは決まっていません。 セルA1の日付データが更新されたらマクロ実行というのが難しいのであれば、 10秒おきにマクロを実行というようなことができないでしょうか。 ご教授願います。

  • EXCEL VBAを用いての並び替えからの挿入表示

    EXCEL VBAを用いての並び替えからの挿入表示についての質問です。 A列に文字と数字の組み合わせデータが入っています。 カテゴリーが4つ「AC○」「BC○」「CC○」「DC○」(○は数字です)があります。 A列は「AC○」「BC○」「CC○」「DC○」の順番で並んでいます。 (ただし3つのカテゴリしかないデータの場合もあり。) そこにC1セルにデータ「AC10」、E1セルにデータ「AC12」、G1セルにデータ「BC10」、I1セルにデータ「DC10」が入ってマクロ実行した場合、添付の『マクロ実行後』のように挿入させたいです。 つまり4つのカテゴリのいずれかを判断し、A列の各カテゴリの一番最後の行に挿入させたいです。 該当したカテゴリがなければ、「AC○」「BC○」「CC○」「DC○」のカテゴリの順で最初の部分に入れる。 このような処理をするにはVBA記述はどのようにすればよいでしょうか? 私のVBAの知識レベルはマクロ記録をしてそれを元に少し修正や機能追加できたりするくらいの初心者です。 よろしくお願いいたします。

  • 【Excel VBA】並べ替え

    Excel2003を使用しています。 あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。 Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。 抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?    A列  C列  D列 2  0000  あ  100 3  1200  い  200 4  1500  う  300        ↓ 2  1200  い  200 3  1500  う  300 4  0000  あ  100 データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。 よろしくお願いします。

  • エクセルVBAでセル選択

    エクセル2000でリストを作成し、VBAで編集しようとしています。 A列に入力されているコードの先頭に「’」をつけて文字列とするための関数をB2のセルからA列のデータが入力されている最後のセルの隣までコピーしたいと思っています。 A列の最終セルを取得するVBAは分かったのですが、その値をB列の選択範囲として使用する方法がわかりません。 エクセルVBAは全くの初心者です。 どなたか教えてください!

  • 急!!Excel VBA 転記マクロを教えて下さい

    Excel VBA超初心者です、 急ぎ作らなければならない資料があり、ご助力願います。 次の様な転記するアクションをコマンドボタンに設定したいです。 Sheet1の列A(先頭セルA2)に入力したデータを、 追加した(入力間違い等を除き、保存した)データ分だけ Sheet2の列B(先頭セルB3)の最終行から転記させていく。 列Aに入力したデータは、並び替えをするので (この分は、今回のVBAに含みません。入力・転記後、Sheet1で普通に並び替えをします。) 列Aと列Bのデータの順番が異なる。 以上です。 どうぞ宜しくお願いします。

  • データベースの最下行に移動するVBAがわからない

    データベースの最下行にデータを入力すべく、マクロを実行すると データベースの先頭のセルが選択された状態で実行されますが 入力後にその入力を終えた最下行の先頭のセルが選択されるように マクロを実行したいのですがどうすればわかりません。 エクセル2010にてVBAで作成しています。 どのようなコードを入力すればできるでしょうか?

  • エクセルのVBA 条件分岐について

    エクセルのVBAで、条件分岐プログラムを考えております。 セルA1に入力された数値が、 2.0以下は"B1セルの値をC1セルへコピー 数値が 5.0以上の場合は"B2セルの値をC1セルへコピー それ以外の場合は”対象外”と表示させたいのですが ご教授お願いします。 又、条件分岐後の部分『C1セルへコピー』の部分を"マクロ1を実行" "マクロ2を実行"というように、変える様な事も出来ますでしょうか? 以上よろしくお願いします。

  • エクセル VBA

    エクセルVBAで以下のようなデータがあります。 D列の文字列と右隣のE列の文字列の2つが入っているものをA列から探し、見つかったセルの上にセルを追加し、E列の右隣のF列に入っている文字列を代入したいです。 どのようなプログラムになりますか?

  • Excel VBA の質問です

    Excel VBA でやりたいことがあるのですが、自分ではわからず困っています。。 データ例として、画像を添付しました。 実行前は、A列に名前、B列にそれぞれ選手の打点(ただし、最初の行は空白)というデータです。 これを実行後のように(A列、B列という場所は変わらずに)、それぞれの選手の打点平均を空白に算出するコードを教えてほしいです(ただし、各打点の入っていたデータはクリア)。 なお、画像例は「中田」までしか載せてませんが、その下にも続いていてデータ最後まで計算させるということをやりたいです。 ぜひ、ご教授願います。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

専門家に質問してみよう