プロが教えるわが家の防犯対策術!

Excelに埋め込んだVBAのプログラムが消えてしまいました。
何か復旧する方法はありませんでしょうか?
心当たりは何もないのですが、原因はありますでしょうか?

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

A 回答 (6件)

>保護することによって、プログラムが消えることは無いですよね?



無い筈です。

消えたとしたら、ファイルが破損して自動修復した際に、破損したVBAのプログラム部分を切り捨てたのだろうと思います。

破損により修復が行われた場合、破損した場所によっては、シートのデータが部分的に失われている可能性もありますから、データの一部が欠落していないか確認した方が良いでしょう。
    • good
    • 3
この回答へのお礼

どうやら、シートだけ別ファイルに移動したときに、
プログラム部分が消えてしまったようです。
移動前のファイルが残っていたので、助かりました。

お礼日時:2013/08/09 12:55

実物を見ることが出来ないので、


「その他、考えられる可能性」を二点。

1)シートモジュールに書き込んだが、当該シートを削除した
  ⇒復旧不可能です。
2)XLSX形式で保存した
  ⇒事前にXLSM形式(あるいはXLS形式)で保存していれば残っているでしょうが・・
   XLSX形式でしか保存していないのであれば、復旧は難しいです。

以上、可能性として参考まで。
    • good
    • 4

>シートの保護をしたのですが、VBAと関係ありますか?



ありますよ。

保護すると、VBAのコードにアクセス出来なくなるので、VBエディタでコードが表示されなくなります。

シート保護中は、あたかも「消えて無くなったように見える」ので、保護を解除して下さい。
    • good
    • 1
この回答へのお礼

保護中は編集できなかったので、保護を解除したのですが、
すべて消えてしまいました。
保護することによって、プログラムが消えることは無いですよね?

お礼日時:2013/08/07 19:01

間違ってモジュールを削除してしてしまったんですかね。



モジュールをエクスポートとかして保存していなければ
復元するのは無理じゃないかと。
    • good
    • 3

>VBAを使って、コマンドボタンを配置して、コマンドボタンをクリックしたときの動作を


>記述したプログラムを作ったのですが、
>今見ると、プログラム部分が消えています。
>コマンドボタンは残っています。

プログラムの作成時に「Visual Basic Editor」が開いて、そこでプログラムを打ち込んだ筈ですが、Visual Basic Editorの方で「上書き保存」は行ってますか?

もし「上書き保存したのはExcelでだけで、Visual Basic Editorの方は何もしないで閉じちゃった」のであれば、プログラムは保存されずに消えます。

Visual Basic Editorの方にも「上書き保存」があるので、両方でちゃんとセーブしないと「書き換わらないで元のまま」になりますよ。
    • good
    • 1
この回答へのお礼

Visual Basic Editorは保存しています。
何日間もかけて作ったので、無くなるとしても部分的だと思いますが、
何もなくなっているので、おかしな操作をしたのかなと思っています。
シートの保護をしたのですが、VBAと関係ありますか?

お礼日時:2013/08/07 16:22

>Excelに埋め込んだ <


 埋め込むことはあり得ないので、何をどうしたのかが問題です。

消えることはありませんので何か勘違いしているか
保存していなかったのか、操作ミスで消したのでしょう。

 具体的に
どうやって埋め込んだのか
それをどこに保存してあったのか
消えたことをどうやって確認したのか
を書きましょう。
    • good
    • 0
この回答へのお礼

VBAを使って、コマンドボタンを配置して、コマンドボタンをクリックしたときの動作を
記述したプログラムを作ったのですが、
今見ると、プログラム部分が消えています。
コマンドボタンは残っています。

お礼日時:2013/08/07 14:24

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

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

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

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

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

QExcelのマクロの復元

マクロ名がマクロ(1)、マクロ(2)、マクロ(3)のマクロを登録し、(1)-(2)-(3)と順次実行するマクロ(4)を登録して使っていました。この時、マクロ(1)~(3)は削除していませんでした。先程、マクロ(4)を変更しようと思い、誤ってマクロ(4)を削除してしまいました。すると、マクロ(1)~(3)も表示されなくなりました。マクロ(1)~(3)が面倒な作業なので復元したいのですが、どなたか宜しくお願いします。

Aベストアンサー

エクセルの「ツール」「マクロ」からマクロを削除したのであれば、1つずつしか削除できないはずなので、通常はすべてのマクロが一度に無くなってしまうことは考えられません。
そこで、「落ち着いてもう一度確認してみてください」と回答したのですが、削除の方法が違うのでしょうか?

勘違いしてマクロの無い別のファイルを上書き保存したとか、あるいはまったく別のファイルを開いているということは考えられないでしょうか。

Q個人用マクロブックが消えました

エクセルで個人用マクロブックを利用していましたが、今日になって急に、VBEのプロジェクトエクスプローラーに、personal.xlsが表示されなくなってしまいました。
ファイル自体が存在してないようです。削除した覚えはないのですが。復旧は不可能でしょうか?
ウィルスチェックは正常でした。こんなふうに突然消えてしまうことは、よくあることなんでしょうか。

Aベストアンサー

わたしもこの前突然消えました。OSがXPでEXCEL2002でしたが、最初理由がわからなかったのでびっくりしましたけどね。
まず確認してほしいのですが、OSがXPであれば
「c:\Document and Settings\ユーザー名\Apprication Data\Microsoft\Excel\XlStart」フォルダの中に「personal.xls」があるかどうか確認してください。
personal.xlsが存在している場合には、Excelを立ち上げてヘルプメニューのバージョン情報を選択し、使用できないアイテムボタンをクリックすると、personalアドインが使用できない設定になっていると思いますので、使用できるようにすれば私の場合はできました。

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

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

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

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

Aベストアンサー

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

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

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

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

Aベストアンサー

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

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

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マクロ作成で、他の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...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

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だからです。

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング