Page 256 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼自分自身の削除の方法? カド 02/9/9(月) 16:38 ┗Re:自分自身の削除の方法? コロスケ 02/9/9(月) 17:14 ┣Re:自分自身の削除の方法? カド 02/9/9(月) 17:24 ┗Re:自分自身の削除の方法? カド 02/9/9(月) 17:35 ┗Re:自分自身の削除の方法? コロスケ 02/9/9(月) 18:03 ┣Re:自分自身の削除の方法? カド 02/9/9(月) 18:54 ┃ ┗Re:自分自身の削除の方法? コロスケ 02/9/10(火) 19:38 ┗Re:自分自身の削除の方法? カド 02/10/24(木) 13:27 ┗Re:自分自身の削除の方法? コロスケ 02/10/24(木) 16:59 ┗Re:自分自身の削除の方法? カド 02/10/25(金) 10:15 ┗Re:自分自身の削除の方法? コロスケ 02/10/25(金) 13:53 ─────────────────────────────────────── ■題名 : 自分自身の削除の方法? ■名前 : カド ■日付 : 02/9/9(月) 16:38 -------------------------------------------------------------------------
ダウンロードしたアドイン ファイルで名前を変えたら、ファイルそのものが消えてなくなりました。 どうやら名前を変えると自分自身を削除するプログラムが書かれているようです。 どうしたらそんな凄いことが出来るのでしょうか?非常に興味があって知りたいです。 ネットで調べたら、DOSを使えばできるとありましたが、その方法だと実施後にDOSのショートカットが出来てしまうのでスマートな感じがしません。 今一番知りたいことです。どうか教えてください。 |
▼カド さん: ファイル操作はあんまり得意じゃないし、名前を変えた瞬間に削除する方法はわかりませんが、 どなたか、凄い方の登場までの時間つぶしにでもどうぞ...。 ファイルをオープンした時点でMyAddin.xlaという名前じゃない場合は自分を削除します。 こんなことじゃないですよね...? '// 以下 ThisWorkbookモジュールに記載 Private Sub Workbook_Open() If ThisWorkbook.Name <> "MyAddin.xla" Then Call 自殺 End Sub Private Sub 自殺() Dim intCnt As Integer With ThisWorkbook .Save For intCnt = 1 To Application.RecentFiles.Count If Application.RecentFiles(intCnt).Path = .FullName Then Application.RecentFiles(intCnt).Delete Exit For End If Next .ChangeFileAccess Mode:=xlReadOnly Kill .FullName .Close SaveChanges:=False End With End Sub |
▼コロスケ さん: まさにこんなことです。 なんとすばらしい。 しかも質問に対するこのレスポンスの速さ!! 土日ネットを探し回ったのはいったい何だったのでしょう。 本当に有難う御座います。 |
▼コロスケ さん: さっきは感動のあまり急いでお礼の返信をしましたが、 よくよく考えると、どうして開いている自分自身を削除することが出来るのですか? 良かったら解説してほしいのですが。 |
▼カド さん: こんにちは。 ファイルの削除はKillステートメントでできるのですが、開いているブックで行うと、 -------------------------------------------------------------------------------- Run-time error '70': Permission denied というエラーがでます。 (すいません、今日本語版がないので...日本語版ではたぶん 書き込みエラーかなにか...) -------------------------------------------------------------------------------- .ChangeFileAccess Mode:=xlReadOnly で一旦、読み取り専用モードにしてやることで削除が可能になります。 説明が下手なので上手くいえませんが、逆に読み取り専用ファイルを ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite でファイル属性を変更すると、次のようなメッセージが出ます。 -------------------------------------------------------------------------------- Book1.xls is locked for editing by another user'. Click 'Notify' to open a read-only copy of the document and receive notification when the document is no longer in Use. 他のユーザーによって編集中なので"お知らせ"ボタンを押しておくと、ファイルが保存された 時に編集可能のメッセージを出します...。みたいなメッセージが出るはずです。 -------------------------------------------------------------------------------- つまり、読み取り専用モードにしてやることで、保存されているブックと、現在開いているブックが 違うブックだよーとエクセルに認識させてやるわけです。(たぶん...) おわかりになりましたでしょうか?(多分この説明ではムリそうですが...) Application.RecentFilesの部分は、最近使ったファイルから履歴を消しているだけです。 説明が違ってたら、どなたかフォローお願いします。m(__)m ではー♪ |
▼コロスケ さん: もう今家に帰って夕食を済ませ、ビールを飲みながら書いています。 本当に解説までしていただきありがとうございます。 久々にいい事があって、幸せな気分です。 コロスケさんは一体どんな人なのでしょう。 プログラムを仕事にしている人ですか?そうでなかったら、どうやってプログラムを習得しているのですか? 自分の妹の子供のころのあだ名がゴロスケだったことも、偶然とは思えない気持ちです。 また、どうしても知りたい疑問があったら投稿します。 |
▼カド さん: 解決してよかったです。 >コロスケさんは一体どんな人なのでしょう。 >プログラムを仕事にしている人ですか?そうでなかったら、どうやってプログラムを習得しているのですか? プログラマではありません。プログラムは素人です(笑) 社内のコンピュータシステムの管理が本職です。 ではー♪ またお会いしましょう。 |
▼コロスケ さん または どなたか親切な人へ 昔の質問を蒸し返して恐縮ですが、読み取り専用にすると削除できるのは、一種のバグ?のような気がします。バグではないにしても、何か今ひとつスマートな感じがしません。 もっと別の方法はないのでしょうか? コロスケさんの回答が良い悪いというわけではないので気分を害さないで下さい。 最初はすごく感動しました。でも時間がたつともっと別な方法があるんじゃないかと欲が出ました。おねがいします。 |
>コロスケ さん はいはーい。久しぶりにフラット立ち寄るとカドさんが..。お久しぶりです。 >何か今ひとつスマートな感じがしません。 全然気分は害していないので誤解しないで下さい。 このコードは結構スマートなほうじゃないかなぁと思ってました。 前に考えたことのあるコードで下記のようなものがあります。 一旦別ブックを作成し、モジュールをインポートして実行させて、実行後にモジュールを削除するものです。 これはもっとスマートじゃありませんが一応別の方法と言うことでアップしておきます。 PS.私ももっとスマートなコードがあれば知りたいので一緒に回答をお待ちしましょう! ではー♪ Sub Suicide2() Dim NB As Object Set NB = Workbooks.Add With Application .DisplayAlerts = False With ThisWorkbook Open .Path & "\xx.bas" For Output As #1 Print #1, "Sub Temp" Print #1, "Workbooks(" & """" & .Name & """" & ").Close False" Print #1, "Kill " & """" & .Path & "\" & .Name & """" Print #1, "Kill " & """" & .Path & "\xx.bas" & """" Print #1, "ThisWorkbook.Close False" Print #1, "End Sub" Close #1 NB.VBProject.VBComponents.Import Filename:=.Path & "\xx.bas" End With .OnTime Now(), NB.Name & "!Temp" .DisplayAlerts = True End With End Sub |
▼コロスケ さん。こんにちわ〜 >はいはーい。久しぶりにフラット立ち寄るとカドさんが..。お久しぶりです。 ちょうど質問したばかりの所にコロスケさんが寄ってくれてちょ〜ラッキーでした。 な〜んだちゃんと別の答えも知ってたんだ〜。 これですよこれ。この答えを期待していました。 なにをもってスマートと言うかは別として、こっちの方が正攻法じゃないのかと思います。アンインストーラーが自分自身を削除する方法もこれじゃないのかなあ? 前にも質問したけどどうやって勉強してるんですか? そういう私もVBAの本を持っているわけでもなく、好きでいろいろ見てるだけで結構出来るようになりましたが。 あとコロスケさんのホームページだけどどうして英語なんだ〜。 非常に興味があるのに読めません。ガッカリです。 それでは、また〜。 |
こんにちは。 >前にも質問したけどどうやって勉強してるんですか? お答えしてなくてすいません。m(__)m では、お答えします。私の単なる意見なので「そんなんじゃ、ダメダー!」と思うときは 反論せずにそぉーっとしておいてください(笑) VBAの本は1冊だけ古いやつを持っています。あとは、Helpとネットサーフィンで勉強してます。 私が一番いいと思っている勉強方法はQAサイトの回答をすることです。 質問されている内容で、結構自分が知りたい内容と重複していることは ありませんか?そんなときにHELPを読んだり、いろいろ調べたりしてチャレンジしてみると身につくと 思います。また同じスレッドに他の回答者の方がレスをつけてくださるときには、他の解き方を見ることが できますんで非常に勉強になります。 そんなところでしょうか...。 ではー♪ |