A1に数字を入力するとB1に加工して転記するマクロ

このQ&Aのポイント
  • A1に入力されるのを監視して、入力された数字を加工してB1に自動的に転記するマクロを書きたいのですが、どのようにすればよいでしょうか?
  • 【B1に下一桁を切り落として、転記】の部分をどう書いていいのか分かりません。
  • 例えば、A1に「12345」と入力された場合、B1は「1234」を入力したいのです。
回答を見る
  • ベストアンサー

A1に数字を入力するとB1に加工して転記するマクロ

A1に入力されるのを監視して、入力された数字を加工してB1に自動的に転記するマクロを書きたいのですが、どのようにすればよいでしょうか? 他の質問(http://okwave.jp/qa/q3163895.html)から、こんな感じかなと思うのですが、【B1に下一桁を切り落として、転記】の部分をどう書いていいのか分かりません。 例えば、A1に「12345」と入力された場合、B1は「1234」を入力したいのです。 よろしくご指導ください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) if Range("A1") <>"" then 【B1に下一桁を切り落として、転記】 End Sub

  • r2san
  • お礼率25% (1309/5228)

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Address = "$A$1" And IsNumeric(.Value) Then .Offset(, 1) = Int(.Value / 10) End If End With End Sub こんなんではどうでしょうか?m(_ _)m

r2san
質問者

お礼

ご回答ありがとうございました。 シンプルかつ実用的で感服いたしました。

その他の回答 (3)

回答No.4

「Worksheet_SelectionChange」とすると、入力と同時にカーソルを動かさない限り、記入が実行されません。例えば Ctrl+Enter で A1 セルに入力すると、失敗します。なので「Worksheet_Change」が望ましいかと思います。 「7.89」→「7.8」、「-7.89」→「-7.8」というふうに丸めるコード書いてみました。2 桁以上の整数の場合は、1 の位を削ります。1 桁の整数や文字列を入力したときは、B1 を空白にします。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Integer, x1 As Double, x2 As Double On Error Resume Next With Range("b1")   If Target.Address = "$A$1" Then     .ClearContents     With Target       n = Len(.Value) - InStr(.Value, ".")       x1 = Int(Abs(.Value) * 10 ^ (n - 1)) / 10 ^ (n - 1)       x2 = Sgn(.Value) * x1     End With     If Int(Target.Value) < Target.Value Then       .Value = x2     Else       .Value = Target.Value \ 10     End If     If .Value = 0 Then       .ClearContents     End If   End If End With End Sub

r2san
質問者

お礼

ご回答ありがとうございました。 プログラムの深みを学ばせていただきました。

  • okgoripon
  • ベストアンサー率44% (1141/2550)
回答No.3

変更が必ず1セルごとなら問題ないのですが、例えばコピペなどで複数のセルが書き換わった場合、普通にIfで比較しても反応しませんので、もうちょっと工夫しないといけません。 'A1セル1個だけ処理出来ればいい場合 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   'Targetに入っている「変更のあった範囲」にA1が含まれているか調べる   If (Not (Intersect(Target, Range("A1")) Is Nothing)) Then     Range("B1").Value = Range("A1").Value \ 10   End If End Sub 'セル複数に対して処理が必要な場合 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   'Targetから「変更のあったセル」を1個ずつ取り出す   For Each c In Target     If c.Cells = Range("A1") Then       Range("B1").Value = c.Value \ 10     Else If c.Cells = Range("A2") Then       'サンプル       Range("B2").Value = c.Value * 10     End If   Next End Sub 後者の場合、If文の代わりにSelect Caseなどで比較しても構いません。 というか、数が多くなるならそうするべきでしょう。 あと、演算子「\」は「整数割り算の商を計算する」演算子です。 エラー処理は書いていないので、適宜足してください。

r2san
質問者

お礼

ご回答ありがとうございました。 エラーの時の分岐など、考えないといけないことに気づきました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

次のようなマクロにしてはどうでしょう。 Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Cells = Range("A1") Then a = Target.Value / 10 Range("B1").Value = Int(a) End If End Sub

r2san
質問者

お礼

非常にシンプル、かつわかりやすいコードをありがとうございました。 無事解決しました。

関連するQ&A

  • エクセル マクロを利用して繰り返して入力する方法

    マクロでA1B1C1D1E1F1セルに入力しF1入力後A2B2C2D2E2F2と 下方向へ繰り返し800行くらいまで入力し、それとB列はスキップしたいのですが下記の方法で別々のシートでは うまくいくのですが同じシ-ト内ではエラ-になってしまいます 次の行への移動 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 7 Then Cells(Target.Row + 1, 1).Select End If End Sub B列のスキップ Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("G1") <> "" Then If Target.Column = 2 Then Target.Offset(0, 1).Select End If End If End Sub どなたかご存じの方教えて下さい

  • 「Excelのセルへの入力内容の転記と元の内容への復帰」

    「Excelのセルへの入力内容の転記と元の内容への復帰」 何故それが必要かは別にして、次のようなことがしたい。 ・あるセル(例えばA1)にはある関数(式)が設定されている。 ・いま、セルA1にある値が入力されたとき、 ・その値を別のセル(例えばB1)へ転記(保存)し、 ・セルA1には元の関数に戻す。 これを、VBAで実現するにはどうすれば良いのでしょうか?。お教えください。 changeやselectionchangeイベントなどを使用すると出来そうですが、単純なコーディングではchangeの無限ネスト(無限再帰)となってしまいます。 例えば、次のようなコーディング:セルC1をA1セル選択時の関数保存場所として補助的に使用している。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "A1" Then Range("B1") = Range("A1") Range("A1").Formula = Range("C1").Formula End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "A1" Then Range("C1").Formula = Range("A1").Formula End If End Sub これでは何か発想の転換が必要に思えます。

  • セルに入力された値を別セルに条件付で転記したい

    エクセルにおいて、 セルのA1に 1 と入力したら セルA2に 半角で Q00000001と表示 セルのA1に 10 と入力したら セルA2に 半角で Q00000010と表示 セルのA1に 100 と入力したら セルA2に 半角で Q00000100と表示させたいです。 先頭は必ずQで計9桁でセルA1の入力値がみたない場合0で埋める。 これを行う一番いい方法は何がありますでしょうか? できたらセルには式は入れたくないです。 そのエクセルには Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call ●● End Sub  が入っています。 シート保護をかけて セルA1とB1しか入力できないようになっています。 今はセルB1に入力するとマクロ●●が走って セルB2にマクロのSelect Caseで変換された値が転記されるようになっています。 もうひとつマクロを作って Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call ●● Call ●●2 End Sub がいいでしょうか? その場合、そのマクロの記述そのものを教えてください。  お願いします。

  • マクロの疑問

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "A2" Then Range("A2").Select End If End Sub とすると、どのセルを選んでもA2に飛ぶのに、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "A3" Then Range("A2").Select End If End Sub とすると、A3を選んでも全く移動しないのはなぜでしょうか。 なにか落とし穴がありそうで。。。 よろしくお願いします。

  • エクセルvba  (ByVal Target As Range)について

    シートのイベントプロシージャーが Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub となりますが (ByVal Target As Range)部分は何なのでしょうか? 何のためにあるのかわかりません。 Private Sub Worksheet_SelectionChange() End Sub としたらエラーが返ってきました。 理由を教えてください。 よろしくお願いします。

  • Excel VBA 他のシートに演算結果を入れたい

    例えば、A~Dというシートのいずれかのo1セルに数値を入力すると、演算結果がp1に入る場合。 A~Dのどのシートでもo1に入力したら、Z!p1にp1の値を放り込みたいのです。 で、以下のようなコードを書いたのですが、上手くいきません。 因みに、セルの移動方向はオプションで「右方向」に設定してあります。 ※結果としてセルの移動を認識していないのか、まったく無反応です。 ※Range("Z!$P$1") =… の行にブレークポイントを設定しても、引っかかりません。 何が悪いのかお教え頂ければ幸甚です。 >違うシートには代入できない… ってことでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$P$1" Then Range("Z!$P$1") = Range("$P$1") End If End Sub ※なお、出典元のSubは以下の様なもので、正常に動作していました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then Range("B1") = Range("B1")+1 End If End Sub

  • エクセルVBAで Cancel=Trueの使い方

    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_Deactivate() Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cancel = True MsgBox "キャンセルしました" End Sub 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?

  • カーソルを動かしたときは発動させたくありません

    エクセルの Worksheet_SelectionChangeイベントで --------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "$A$1です" End If End Sub --------------------------------------------------------- のコードを標準モジュールに書いて、A1セルをクリックすると、MsgBoxが表示させますが、 B1セルから、キーボードの「→」キーを押してA1に移動してもMsgboxが表示されてしまいます。 クリックした時はマクロを発動させたいのですが、カーソルを動かしたときは発動させたくありません。 そんな事は可能でしょうか?

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • セル値

    すみません エクセルVBA勉強中のものですが、セルA1とA2がブランクだったら、セルB1に”あ”を表示するという式を作ったのですがうまく動いてくれません ご指導のほどお願いします。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Cells(1, 1).Value <> "" & Cells(2, 1).Value <> "" Then Cells(1, 2).Value = "あ" End If End Sub

専門家に質問してみよう