dポイントプレゼントキャンペーン実施中!

こんにちは。
入力データを転記した時、同時にマクロの記録により入力データを消去するようにしています。消去するマクロは、転記コード中に、呼び出すようにしています。もし間違ってデータを転記した場合、マクロでは戻せないと書いていますが、UndoのApplication.Undoで戻せると書いていました。このコードは、データを入力した後、まだマクロを実行する前に間違った場合に戻すときに有効なのかなと思って使っていません。本当にApplication.Undoので元に戻るのでしょうか。元に戻す方法を教えて下さい。実行しようとしているVBAコードは次のとおりです。
Public Sub 転記()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim maxrow As Long
Dim Row As Long
Dim dicT As Object
Dim key As Variant
Set sh1 = Worksheets("納品書台帳")
Set sh2 = Worksheets("入力シート")
Set dicT = CreateObject("Scripting.Dictionary")
maxrow = sh1.Cells(Rows.Count, "D").End(xlUp).Row

'伝票番号を記憶
For Row = 7 To maxrow
key = sh1.Cells(Row, "D").Value
dicT(key) = Row
Next
key = sh2.Cells(8, "R").Value

If dicT.exists(key) = False Then
MsgBox ("伝票番号=" & key & "は納品書台帳にありません")
Exit Sub
End If

If sh2.Cells(12, "E").Value = "" Then
MsgBox ("名前が未入力です")
Exit Sub
End If

If sh2.Cells(24, "S").Value = "" Then
MsgBox ("金額が未入力です")
Exit Sub
End If

Row = dicT(key)

sh1.Cells(Row, "G").Value = sh2.Cells(12, "E").Value '名前
sh1.Cells(Row, "H").Value = sh2.Cells(24, "S").Value '金額

sh1.Cells(Row, "AH").Value = sh2.Cells(16, "D").Value '商品名
sh1.Cells(Row, "AI").Value = sh2.Cells(16, "H").Value '単価
sh1.Cells(Row, "AJ").Value = sh2.Cells(16, "F").Value '数量
sh1.Cells(Row, "AK").Value = sh2.Cells(16, "R").Value '計

sh1.Cells(Row, "AL").Value = sh2.Cells(17, "D").Value '商品名
sh1.Cells(Row, "AM").Value = sh2.Cells(17, "H").Value '単価
sh1.Cells(Row, "AN").Value = sh2.Cells(17, "F").Value '数量
sh1.Cells(Row, "AO").Value = sh2.Cells(17, "R").Value '計

sh1.Cells(Row, "AP").Value = sh2.Cells(18, "D").Value '商品名
sh1.Cells(Row, "AQ").Value = sh2.Cells(18, "H").Value '単価
sh1.Cells(Row, "AR").Value = sh2.Cells(18, "F").Value '数量
sh1.Cells(Row, "AS").Value = sh2.Cells(18, "R").Value '計

sh1.Cells(Row, "AT").Value = sh2.Cells(19, "D").Value '商品名
sh1.Cells(Row, "AU").Value = sh2.Cells(19, "H").Value '単価
sh1.Cells(Row, "AV").Value = sh2.Cells(19, "F").Value '数量
sh1.Cells(Row, "AW").Value = sh2.Cells(19, "R").Value '計

sh1.Cells(Row, "AX").Value = sh2.Cells(20, "D").Value '商品名
sh1.Cells(Row, "AY").Value = sh2.Cells(20, "H").Value '単価
sh1.Cells(Row, "AZ").Value = sh2.Cells(20, "F").Value '数量
sh1.Cells(Row, "BA").Value = sh2.Cells(20, "R").Value '計

sh1.Cells(Row, "BB").Value = sh2.Cells(21, "D").Value '商品名
sh1.Cells(Row, "BC").Value = sh2.Cells(21, "H").Value '単価
sh1.Cells(Row, "BD").Value = sh2.Cells(21, "F").Value '数量
sh1.Cells(Row, "BE").Value = sh2.Cells(21, "R").Value '計

sh1.Cells(Row, "BF").Value = sh2.Cells(22, "D").Value '商品名
sh1.Cells(Row, "BG").Value = sh2.Cells(22, "H").Value '単価
sh1.Cells(Row, "BH").Value = sh2.Cells(22, "F").Value '数量
sh1.Cells(Row, "BI").Value = sh2.Cells(22, "R").Value '計

sh1.Cells(Row, "BJ").Value = sh2.Cells(23, "D").Value '商品名
sh1.Cells(Row, "BK").Value = sh2.Cells(23, "H").Value '単価
sh1.Cells(Row, "BL").Value = sh2.Cells(23, "F").Value '数量
sh1.Cells(Row, "BM").Value = sh2.Cells(23, "R").Value '計

MsgBox ("転記完了印刷します")    ←Sh1にボタンで自動転記
Call 印刷 'Sub印刷()を呼び出す。  ←Sh2のデータをコピーした伝票を印刷
                   
sh1.Cells(2, "D").Value = sh1.Cells(maxrow, "D").Value + 1  ←以下2Dを次数に、2Eを空欄に

sh1.Cells(2, "E").Value = ""
sh1.Cells(maxrow + 1, "D").Value = sh1.Cells(maxrow, "D").Value + 1

Call 入力データ消去 'Sub 入力データ消去()を呼び出す。 ←Sh2のデータをSh1に転記した時に消去           

End Sub

A 回答 (3件)

#2です


>当面、転記伝票印刷後に、別ボタンで入力データを消去することにします。
それが、良いと思います。

一応、#2について
配列に入れて・・は少し分かりにくいかも知れません。
(処理的には早いので良いのですが)

簡単に考えると、ロジックは、コードを書き込む処理にワンクッション入れるような感じで
例えば、使っていない行など、どこかの行に (配列でなくセル範囲を使う場合)
sh1.Cells(Row, "G").Value = sh2.Cells(12, "E").Value '名前
と同じように値を入れます。

(削除内容が良く分かりませんが)コードにすると

Call 印刷 'Sub印刷()を呼び出す。  ←Sh2のデータをコピーした伝票を印刷
Call tmp(row)’ここで一時保存する(適切な場所なのかは、検討が必要)




End Sub

’戻すのに必要なデータ(全部か分かりませんが)
Sub tmp(row As Long)
With Worksheets("TMP")
.Cells(1, 1) = row
.Cells(1, 2) = sh1.Cells(row, "G").Value '名前
.Cells(1, 3) = sh1.Cells(row, "H").Value '金額
For i = 34 To 65
.Cells(1, i - 30) = sh1.Cells(row, i).Value '商品名
Next

End Sub

シート名 TMP があるとして
1行目に仮保存している

Call 入力データ消去 で削除されてもシートTMPに保存されているので
Sub tmp(row As Long)処理の逆を(戻すボタン)で実行すれば
良いと言う事に、ただ、書き込まれている最終行などをクリアーしないとならないと思います。
    • good
    • 0
この回答へのお礼

有難うございました。>書き込まれている最終行などをクリアーしなければ・・・。ご指摘のとおり、入力シートに戻すだけではなく、台帳の一連番号、コード等を転記、繰り上げ等のクリアーしないとならない部分があります。スキルがないので時間がかかりますが、ご指導頂いたコードを参考に試行錯誤してみます。
いつもご教授有難うございます。

お礼日時:2022/03/22 17:52

こんにちは、


すでに回答にある通りこの場合、戻すことは出来ません。

そもそもですが、戻すとはクリアーすれば良いだけのようにも思いますが
戻すの意味が少しわかりませんが、どうでしょう。

もし、戻す機能をVBAに入れたいのなら、
記憶回数を制限しないと少々問題がありますが、
処理の実態をグローバル変数の配列などに格納して呼び出すようなロジックが必要になります。

概ね値を操作しているだけのようなので
コード自体を配列に入れるロジックに変えて
(各変数値とシートオブジェクト、取得値を変数に入れて)実行するようにすれば、戻す時、Ubound(配列)- 何回前 の配列インデックスを呼び出し対象セル双方に実行すれば戻ると思います。
(元の値で処理しているので戻している訳では無いけれど見かけ上そのように見えます)
    • good
    • 1
この回答へのお礼

いつも有難うございます。入力したデータで請求書等の伝票を発行(印刷)した後に、数値等の一部に間違いがありデータを訂正し再発行したい場合に、消去されたデータをSh2の入力シートに戻したら、再度の手入力(コード番号だけなのですが・・)の手間が省けると良いなと浅はかな考えでした。当面、転記伝票印刷後に、別ボタンで入力データを消去することにします。>コード自体を配列に入れるロジックに変えて・・・については、試行錯誤にてやってみます。

お礼日時:2022/03/22 16:24

>本当にApplication.Undoので元に戻るのでしょうか。


一度お試しください。
残念ながら戻せません。

SendKeys だけを使ったマクロなら、戻すことは可能ですが、
SendKeys での実行はメチャクチャ遅いです。
これも一度お試しください。
    • good
    • 0
この回答へのお礼

有難うございます。初めての用語です。調べてみます。

お礼日時:2022/03/22 13:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!