人に聞けない痔の悩み、これでスッキリ >>

excel2003で以下の様に記述しました。

Sub clear()
Range("A1", "B3").Value = ""
End Sub

上記でフォームボタンをクリックして、指定したセルの内容を空白にすることはできたのですが、
ctrl+zで元の内容を戻そうとしたところ、できませんでした。

なにか方法があれば、ご教示お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Undo のヘルプには


------------------------------------------------------------
備考
Undo メソッドは、マクロを実行する前にユーザーが実行した最後の操作を元に戻す場合にだけ使用できます。
このメソッドは、マクロの先頭に記述する必要があります。
Visual Basic で実行したコマンドは元に戻すことができません。
------------------------------------------------------------

『Visual Basic で実行したコマンドは元に戻すことができません。』
ユーザーが手作業?で行ったものに関してはアプリケーションで順次履歴を記憶して行きますが
VBAで行ったものは範疇にありません。
なので、Ctrl+Zでも戻せません。

Copyメソッドか何かでどこかに退避させて、Ctrl+Z の代わりに Ctrl+V とか?
コピー先のセル範囲を指定します。この引数を省略すると、クリップボードにコピーします。
    • good
    • 0

残念ながら


http://nyama.jpn.org/otto/xlstip.shtml

マクロのやり直し(2001/11/24)
マクロを実行は基本的にやり直すことが出来ません。あとで、選んだセルが間違っていることに気づいてもどうにもならないのです。「基本的な命令ばっかり使っているのになぜ??」と思います。
とあります。参考にしてください。
    • good
    • 0

使ったことはありませんが


Application.OnUndo
で実現できそうです。

ヘルプなどを見てがんばってみてください。
    • good
    • 3

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qマクロ実行後元に戻すことは

エクセル等でマクロ実行後、実行前の状態に戻すことはできないのでしょうか?
"元に戻す"のボタンはクリックできない状態になってしまいますが。

Aベストアンサー

マクロの実行は、プログラムの実行でなされるので、「元に戻す」は実行できません。「元に戻す」は多分手操作のヒストリを保持していて、もとの状態に戻すことを行うように、組みたてられていつるようで、マクロの場合、手操作をやることを自動化すると説明されていることが多いですが、処理実行ルートが違うようです。
元に戻すが効かない有名・代表的な例です。ワークシートの挿入削除なども元に戻りません。
その差が出る根本原因がなになのか(複雑さを避けただけなのか)、知りたいですが、寡聞にし、説明に出会ったことがありません。

QVBAにて『元に戻すボタン』を作りたい

お世話になります。

当方、EXCEL2003を使用しております。
現在、Textboxに入力した値をエクセルのセルへ代入していく
フォームを作成しているのですが、このフォームに『元に戻す』
ボタンを追加したいと考えております。
つまり、ひとたびセルに代入した値を代入される前の状態に戻す
作業をフォーム上から行いたいのです。

正直、vbaの知識はまだあまり持ち合わせておらず、本やネットを
参考に組んでいるレベルです。
どうか、宜しくお願いいたします。

Aベストアンサー

>この場合、ご説明頂いたような、("a1")のように特定のセルを記述する方法だとうまくいかないのです。
別に数が増えただけで、基本的に出来ますよ

'書き込みボタン
Private Sub CommandButton1_Click()
Select Case ComboBox1
Case "第1分冊_テキスト"
rtn0 = ComboBox1.Value
rtn1 = Range("E7").Value
rtn2 = Range("H7").Value
rtn3 = Range("I7").Value
rtn4 = Range("I7").Interior.Color
Range("H7") = Range("E7").Value
Range("I7").Interior.Color = vbYellow
Range("I7") = ""
Range("E7") = TextBox1.Value
TextBox1 = ""
Case "第1分冊_添削問題"
rtn0 = ComboBox1.Value
rtn1 = Range("E8").Value
rtn2 = Range("H8").Value
rtn3 = Range("I8").Value
rtn4 = Range("I8").Interior.Color
Range("H8") = Range("E8").Value
Range("I8").Interior.Color = vbYellow
Range("I8") = ""
Range("E8") = TextBox1.Value
TextBox1 = ""
End Select
End Sub

'戻すボタン
Private Sub CommandButton2_Click()
Select Case rtn0
Case "第1分冊_テキスト"
Range("E7").Value = rtn1
Range("H7").Value = rtn2
Range("I7").Value = rtn3
Range("I7").Interior.Color = rtn4
Case "第1分冊_添削問題"
Range("E8").Value = rtn1
Range("H8").Value = rtn2
Range("I8").Value = rtn3
Range("I8").Interior.Color = rtn4
End Select
End Sub

同じ処理なので、後半端折りました
ComboBoxの値も変数へ取り込み
書き込みの時と同じように、その変数でselect caseで判断すればよいのです
ここに気づけば、最初の回答と同じ処理でいけますよね

>この場合、ご説明頂いたような、("a1")のように特定のセルを記述する方法だとうまくいかないのです。
別に数が増えただけで、基本的に出来ますよ

'書き込みボタン
Private Sub CommandButton1_Click()
Select Case ComboBox1
Case "第1分冊_テキスト"
rtn0 = ComboBox1.Value
rtn1 = Range("E7").Value
rtn2 = Range("H7").Value
rtn3 = Range("I7").Value
rtn4 = Range("I7").Interior.Color
Range("H7") ...続きを読む

QエクセルVBAの、「元に戻す」ボタンについて

エクセルVBAの、「元に戻す」ボタンについて

エクセル2007を使用しています。

そこで、マクロを書いているのですが、

マクロを実行すると、エクセル画面上の「元に戻す」ボタンが効かなくなってしまいます。

マクロで変更したセル内容等が元に戻せないなら納得できるのですが、
エクセル上で、手入力で変更した、マクロ実行直前の状態にも戻せません。
(手入力で変更した内容と、マクロで実行した内容は、別の物です)

しかも、「Worksheet_SelectionChange」を設定しているため、手入力で何か変更し、
他のセルをクリックしたらもう、手入力した内容を元に戻ないため、
事実上エクセル画面上の「元に戻す」ボタンはないに等しいです。

このようなものなのでしょうか?

もし回避策とうあれば、
情報いただけますとありがたいです。よろしくお願いいたします。

Aベストアンサー

ほかに自動保存のアドインなどを組み込んでいる場合も「元に戻す」が効かなくなりますね。
そういうものとあきらめるしかなさそうです。
http://oshiete.goo.ne.jp/qa/494940.html
http://park11.wakwak.com/~miko/Excel_Note/14-01_macro.htm#14-01-10

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qマクロを実行した後は「元に戻す」はできないのでしょうか?

マクロを実行した後に戻したくなった時は
「元に戻せません」となってしまいます。

なぜでしょう?

マクロはそういうものなのでしょうか?

(簡単なマクロの知識しかありません)

回避する方法はあるのでしょうか?

よろしくお願い致します。

Aベストアンサー

こんばんは。

マクロを実行する前の状態のプロパティ等をStatic 変数等に保持して、必要になったら戻すというようなプログラムを書かないといけないわけです。それは、Excelのアプリケーション自体が出来るのは、そういうプログラムを書いているわけです。VBAでは、Excelのアプリケーション側のコマンドは基本的には動いていないので、そのメモリの記録を利用することは出来ないのだと思います。

ただし、マクロ実行中の最中は、Undo が利きます。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む


人気Q&Aランキング