お世話になります。VB6.0でUnlha32を使用してLZHファイルを解凍後、LZHファイルを削除する処理を作ってみたのですが、LZHをいざKILLステートメントで削除しようと思うと、”パスが無効”と出てしまって削除できません。

ret=Unlha(・・・)
if ret = 0 then
ChDir LZHファイルがあるフォルダ
Kill LZHファイル  ← ここでエラーが出る
end if

こんな感じなのですが、Killの前で何かやっておかなければならないのでしょうか?
例えばNothing や Closeのように 処理と切り離すコマンドが必要なのかな?

A 回答 (3件)

LZHファイルが「別のドライブに存在」するのではないでしょうか?


ChDirでは「そのドライブのフォルダが変更されるだけ」で,ドライブは変更しません.
そして「フォルダの変更状態はドライブ毎に独立して存在する」のです.

ret=Unlha(・・・)
if ret = 0 then
ChDrive LZHファイルがあるドライブ
ChDir LZHファイルがあるフォルダ
Kill LZHファイル
end if

こんな感じでいかがでしょうか?
おそらくヘルプを読まれたようですね.
KILLステートメントの例が,フルパス指定ではなかったのかもしれません.
しかし,私もKojiSさんのアドバイス通り,KILLステートメントにフルパス指定される方がベターかと思います.
がんばってください.
    • good
    • 0

-jsbスイッチは指定していますよね?

この回答への補足

解凍は下記の通りでやってます。

ret = Unlha(Me.hWnd, "e -ngm """ & FreezeFile & """ """ & workPath$ & """ ""*.*""", Buff, 64000)

成功すれば ret=0 ですよね。

皆様、色々ご回答ありがとうございました。
結局、イージーミスであることが発覚しました!!
元々、解凍しているファイルはCD-ROMに焼いたものを手で固定フォルダへコピー後、解凍プログラムを起動していたものであり、つまり!そのままだと「読み取り専用」の属性が付いたまま削除処理をしようとしているのですね。
本当にごめんなさい。(こんな簡単なことがわかるのに丸一日かけてしまいました(TT))
無事解決しました。

補足日時:2001/03/23 17:07
    • good
    • 0

なぜ Killでフルパスを設定しないかが疑問です。

一度フルパスで指定してみてください。それでエラーになる場合は、フォルダかファイル名が間違っています。

この回答への補足

ごめんなさい、説明が足りませんでした。
フルパスでも試してみましたがダメでした。
あるマシンではエラーが出ないのですが、処理スピードが遅いマシン(Pentium133)だとダメなんです。
そこで、きっとファイルが「処理中」or「開いている」といった情報がどこかに残っていて、削除できない状態にあるのではないかと思っています。
でもOpenステートメントのCloseのようなコマンドが書庫解凍の時には何になるのかがよくわかりません。
下手な説明ですみません。

補足日時:2001/03/23 16:06
    • good
    • 0

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

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

QIf Not c Is Nothing Then ~延々処理が続く~ End If

質問というか相談というか
VBAで下記のようなコードをよく見ますし、私自身もこれで書いてます。

For i= 1 to 10
set c=Range.Find(”いろは")
If Not c Is Nothing Then


処理が続く


End If
Next i

cが見つからなかったら、さっさと次の i に進む場合の処理です。Ifの字下げがず~~っと延々続き、最後のNext iの直前でEnd If です。
・Exit For はあるのに 途中Next iは出来ない
・Goto 使って書くと「スパゲティプログラムだ」とか言われる
正直言って、上記コードとGotoスパゲティで可読性に差異があるとは思えません。何でもかんでもGotoはダメていう風潮がおかしいように思えます。

みなさんどうやって書いてますか?

Aベストアンサー

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next i

これって、よく見るとおっしゃっていますが、ひとつ例外に、いわゆる「ブルートフォースアタック(総当り制)」のコードがありますね。それは、Goto 以外に抜け出せる方法がありませんね。「深いネストはするな」という禁を犯しているのだから、Goto 以前のものがあります。(何に使うかはご存知だと思いますし、それをとやかく言う人はいないでしょう。)

これを書き換え、再帰を使うと良いとか言う人もいるのでしょうけれども、そういうのは、知識だけで実際にやったことがない人の話だと思います。「スパゲティ」とか知らない人に、比べさせれば、再帰などを使った方法は、遅くてダメ出しされるのは目に見えています。特殊な例ですが。

ご質問で、実際の私は、内容にもよりますが、
Private flg As Boolean

Sub Main()
On Error Goto ErrHandler
For i= 1 to 10
 Call subRutine(findTxt)
 If flg Then Exit For
Next i
Exit Sub

ErrHandler:
処理
End Sub
'ここの中身はテンプレート化してあります。
Private Sub subRutine(ByVal findTxt) または、Public
'処理
End Sub

としているはずで、モジュールレベルの変数を、flg とし、サブルーチンの中に置いて、目的がかなったら、Flgは、Trueになって、ループから抜け出すようにします。

サブルーチン側では、End ステートメントを使用することさえもあります。(テンプレート化しているのは、Findメソッド、RegExpの正規表現、Sortメソッド、Dictionary とSortLists などがあります。[MZ-Tools 3.0]を使用)

GOTO は、構造化プログラムが登場した時に、排除するように言われてきたものです。古い時代の人は、GOTOに逃げたくなるのを抑えるために、「GOTO」を使うなって、肝に命じてきたのです。しかし、結局、Goto は、なくならなかったのは、一つには、ErrHandlerを使った、エラートラップのせいもあります。だから、Goto を書かないでErr.Raise (513~)で飛ばす方法がありますが、あまり使う人はいません。

ところで、
「スパゲティプログラム」という話に振られると、私は自信がありません。
読みやすさ(可読性)の対極になるものでしょうけれども、誰に対して言っているものか、ということです。私の大事にしている本の中に、アスキーの『QuickBASICプログラミング道場』(1991年)という本があります。

---引用
・本道場で推奨するプログラミングスタイル (p25~)

1.変数・定数・プロシージャーの命名法 (変数の型のサフィックスは使うな)
2.インデントを付けるべし
3.メインプロシージャは短くすべし
4.プロシージャは短くすべし
5.長いブロックはプロシージャーにすべし
6.汎用性のあるプロシージャーを作るべし
7.定数は活用すべし
8.GOTOは乱用(濫用)すべからず。●
 従来のBASICを使ってきた人の中には、GOTO文を多用する人がいるようだ。GOTO文はそのときは便利なように思うが、あとになってリストを眺めてみると、どこに飛んでいるか分からなくなることが多い。……わけがわからない最低の"スパゲティプログラム"になってしまう。
 【例】GOTO文をDOループに置き換える
----引用終わり

現代でも通用するというよりも、その言葉が生まれた時代背景がありますから、必ずしも、GOTOが問題だということではなさそうです。Goto を使わないということにこだわると、逆に墓穴を掘ることになります。

それと、DO ループにするというのは、DO ~ LOOPの間に緊張感(?)は生まれるけれども、無限ループを生み出しやすくなるのです。その頃はそれで良かったかもしれませんが、もうESCでは止まりません。今は必ずしも認められるものではありません。

それと、記録マクロを、そのままVBAプロシージャーに用いるのは、絶対にダメなのですよね。本当のスパゲティプログラムになってしまいます。ベタ書きになってしまうからで、一度、そういうコードを直してくれと言われましたが、怒りを抑えて、丁重にお断りました。

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next...続きを読む

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

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

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QIf~Thenステートメントについて

お世話になります。

マクロを作成するのに、If~Thenを使用したいのですが上手く使えません。

<例>
A列に文字・数字が入っているとき→B列に”い”、C列に”う”、D列に”え”と反映させる。
A列が空白のセルになったら→その行はすべて空白にする。
行数は50行程度の予定です。

    A      B      C      D
1   あ     い      う      え
2   空白   空白     空白    空白
3   あ     い      う      え
4   空白   空白     空白    空白

----------------------------------------------------------

数値に対して一致・大小等の条件であれば、問題なく作成できたのですが…。
私の探し方が悪いのだとは思いますが、
セルが空白か否かを判断して文字を反映させる、というのが見つけられませんでした。

関数を使えば簡単なのは承知しておりますが、その他の処理をすべてマクロで作成したので、
できれば統一させてしまいたい…と思っています。
初心者用の本を見ながら作成している初心者ですが、何卒ご教示頂けませんでしょうか?
よろしくお願いいたします。

お世話になります。

マクロを作成するのに、If~Thenを使用したいのですが上手く使えません。

<例>
A列に文字・数字が入っているとき→B列に”い”、C列に”う”、D列に”え”と反映させる。
A列が空白のセルになったら→その行はすべて空白にする。
行数は50行程度の予定です。

    A      B      C      D
1   あ     い      う      え
2   空白   空白     空白    空白
3   あ     い      う      え
4   空白   ...続きを読む

Aベストアンサー

こんな感じ
Sub ボタン1_Click()
For i = 1 To 50
If Range("A" & i).Value = "" Then
Range("B" & i).Value = ""
Range("C" & i).Value = ""
Range("D" & i).Value = ""
Range("E" & i).Value = ""
Else
Range("B" & i).Value = "い"
Range("C" & i).Value = "う"
Range("D" & i).Value = "え"
Range("E" & i).Value = "お"
End If
Next
End Sub

QEXEでのENDステートメント動作

VB6.0(SP5)を使用しています。OSはXp Proです。
自作アプリのEXEでの動作で困っています。ENDステートメントが正常に機能しません。

MDIフォームで、メインフォームのLoad中、何らかのエラー(DLLの初期化失敗など)が発生した場合に、ENDステートメントでアプリケーションを終了させています。
VBでデバッグさせている状態だと問題無く終了します。
しかし、コンパイル後のEXEで動作させると必ずメインMDIフォームを表示(起動?)します。
この時に起動されるメインMDIフォームは、各種メニュー等は起動不可で、右上×印の終了ボタンのみ機能します。

ToolBarコントロールを使用しているか否かで、症状が変わります。
(1)MDIフォームにToolBarコントロールを組み込んだ状態
 上記、MDIフォームが表示される現象が発生します。
(2)MDIフォームにToolBarコントロールを組み込んでいない状態
 正常に終了します。
ToolBarコントロールのプロパティを何か変更する必要があるのでしょうか?

自作アプリだけの問題かとも思い、下記のような単純サンプルを作成して確認しましたが、EXEで動作させるとやはり同様の症状が発生します。

-------------------------------------------------
Private Sub MDIForm_Load()
End  '何もせずに終了する筈。
End Sub
-------------------------------------------------

ENDステートメントの直前で、何か実行する必要があるのかと思い、下記のようにも試してみました。

1)ToolBarを非表示にする。
Toolbar1.Visible = False 又は Set ToolBar1 = Nothing
END  '何もせずに終了する筈。
結果:ツールバーが非表示になるだけで、メインMDIフォームは表示されます。

2)メインMDIフォームを無効にする。
MDIForm1.Enabled = False
END  '何もせずに終了する筈。
結果:我ながらマヌケですが、メインMDIフォームが表示され、尚かつ×印すらクリック不可でした。

3)メインMDIフォームを非表示にする。
MDIForm1.Visible = False
END  '何もせずに終了する筈。
結果:MDIフォームが非表示となり、一見、よさそうですが、タスクマネージャで確認すると、該当アプリのタスクは終了はしていませんでした。

その他、ENDの代わりに、STOPを使用してみました。
この場合は、STOP実行時に「STOPステートメントで中断しました」とのメッセージが表示され、OKボタンで、やはりメインMDIフォームが表示されます。

どなたか、MDIフォーム+ToolBarコントロールを組み込んだ状態で、正常にENDステートメントを動作させる方法を教えてください。(EXEでの動作です。)

また、VBでデバッグさせている状態だと問題無く終了するのは何故なのでしょうか?。
よろしくお願いします。

VB6.0(SP5)を使用しています。OSはXp Proです。
自作アプリのEXEでの動作で困っています。ENDステートメントが正常に機能しません。

MDIフォームで、メインフォームのLoad中、何らかのエラー(DLLの初期化失敗など)が発生した場合に、ENDステートメントでアプリケーションを終了させています。
VBでデバッグさせている状態だと問題無く終了します。
しかし、コンパイル後のEXEで動作させると必ずメインMDIフォームを表示(起動?)します。
この時に起動されるメインMDIフォームは、各種メニュー等は起動不可で...続きを読む

Aベストアンサー

Initializeイベントで
Me.TooBar1.Enabled = False
を実行しておきます

こうしておけば MDIフォームのLoadイベントでEndステートメントも実行されるようです

ツールバーの初期化が関係しているのかもしれませんね

QIf myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou こちらについて教えていただきたいです。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, i + 24) = myTorikomibi
Next i
マクロを編集しようとしましたところこちらが解読できづに困っています。
こちらだけとりだして実行しながら解読していますが混乱してしまっています。ご存知の方いらっしゃいましたら教えてください。Then以降がわかりません。よろしくお願いいたします。

myTorikomibi = Range("A2").Value
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, 4) = myTantou
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, 14) = myTantou
If myCityBUNRUINO = 2 Then Cells(myPrefNO + 3 - 47 - myCityNu, 24) = myTantou
For i = 1 To 3
If myCityBUNRUINO = 0 Then Cells(myPrefNO + 3, i + 4) = myTorikomibi
If myCityBUNRUINO = 1 Then Cells(myPrefNO + 3 - 47, i + 14) = myTorikomibi
If myCityBUNRUINO = 2 Then Cells...続きを読む

Aベストアンサー

こんにちは。maruru01です。

ヘルプはご覧になりましたか?
特に、Cellsについて。
Cellsは、

Cells(行番号, 列番号)

で、セルを参照します。
なので、各条件の時に、変数「myTantou」や「myTorikomibi」に格納されている値をそれらのセルに代入しているだけですが。
ただし、行番号が、

「myPrefNO + 3 - 47」
「myPrefNO + 3 - 47 - myCityNu」

などとちょっとややこしくなっていますが。
これも、変数「myPrefNO」「myCityNu」に入っている値から行番号が決まるというだけです。
例えば、
myPrefNO=60
myCityNu=2
なら、下の例は、
60+3-47-2=14
で、14行目となるということです。


人気Q&Aランキング

おすすめ情報