• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:A1に数字を入力するとB1に加工して転記するマクロ)

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

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

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

  • ベストアンサー
  • 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/2548)
回答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
質問者

お礼

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