[[20220505141340]] 『EXCELが終了する原因と修正方法』(初心者のM) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『EXCELが終了する原因と修正方法』(初心者のM)

ファイルのフルパスをドラッグ&ドロップで取得したくて下記のURLを参考にコードを拝借してコードを書きました。
(コードの変更が一部あります)

https://excel.syogyoumujou.com/memorandum/d_and_d_1.html

コード自体は作動するのですが
ファイルのドラッグ&ドロップの後でEXCEL自体が終了してしまいます。
(ユーザーフォームが閉じられてもEXCEL自体は終了させたくない)

原因は、どこに有るのでしょうか ?
また、修正方法を教えてください。

ユーザーフォームのフォームモジュールに以下のコード

Option Explicit

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, _

                                  Effect As Long, Button As Integer, _
                                  Shift As Integer, _
                                  x As Single, _
                                  y As Single)
    Dim i As Long
    Dim strFilesPath() As String
    With Me
        AppActivate .Caption 'ユーザーフォームをアクティブにする
        .ListView1.ListItems.Clear
        If Data.Files.Count < 1 Then Exit Sub '引数Data
        ReDim strFilesPath(1 To Data.Files.Count)
        For i = 1 To Data.Files.Count
            strFilesPath(i) = Data.Files(i)
        Next
        'MsgBox Join$(strFilesPath, vbCrLf)
        Worksheets("Label").Range("H2") = Join$(strFilesPath, vbCrLf)
        Unload UserForm1
    End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    With Excel.Application
        If 1 < .Workbooks.Count Then
            .Visible = True
            With .ThisWorkbook
                .Saved = True
                .Close
            End With
        Else
            .Visible = True
            .DisplayAlerts = False
            .Quit
        End If
    End With
End Sub

標準モジュールに以下のコード

Public Sub Main_Form_Show()

    'Excel.Application.Visible = False
    UserForm1.Show vbModeless 'フォームが開いたままの状態でExcelの操作は可能。
End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


すいません、
参考のURLの記事をもう一度見てみると

※ListViewコントロールは64bit版のOfficeに対応していない。
以下のコードやサンプルファイルは32bit版のExcelを対象とする。

とありました。
自分のOfficeは64bit版なのでこれがやはり原因でしょうか ?

原因であれば、今回のコードが使えないことになり
他の手段(コード)を考える必要が出てきます。

(初心者のM) 2022/05/05(木) 14:25


 参考になりそうな気がするですよ。
 https://www.excel.studio-kazu.jp/kw/20181211140007.html
 頑張ってください。
(あみな) 2022/05/05(木) 15:07

あなみさん、参考になりそうな記事の紹介ありがとうございます。

記事を見るとAbyssさんの記事が参考になりそうなので見てみました。

Abyssさんのコードで

>(標準モジュール) IDropTarget interfaceとして使用
>'--------------------------------------------------------------------

Public Type TDragDrop以下を標準モジュールにコピペとの事だと思うのですが
Sub()から始まっていないし、#ifとか#Else、#End ifなど
私が知らない見かけないコードがあります。

どう解釈すれば良いのでしょうか ?

(初心者のM) 2022/05/05(木) 16:21


ファイル名は一つ取得するだけでいいので(複数取得しなくていいので)

もうひとつの
「WebBrowserコントロール」の方法で旨く行きそうです。

https://qiita.com/Hacomo/items/74d881f0aecef8cf513e

現在進行中です。
(初心者のM) 2022/05/05(木) 16:50


 >現在進行中です。

 頑張って٩(,,•ω•,,)و⚑

 >Abyssさんのコードで
 >どう解釈すれば良いのでしょうか ?

 Typeステートメント									
 http://officetanaka.net/excel/vba/statement/Type.htm									

 第110回.ユーザー定義型・構造体(Type)									
 https://excel-ubara.com/excelvba1/EXCELVBA410.html									

 Windows API を使う(Declare ステートメント)									
 https://excelwork.info/excel/windowsapideclare/									

 Declare ステートメント									
 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/declare-statement									
 http://officetanaka.net/excel/vba/statement/Declare.htm									

(あみな) 2022/05/05(木) 17:22


以下の「WebBrowserコントロール」の方法を参考に
https://qiita.com/Hacomo/items/74d881f0aecef8cf513e

URLの記事と同じくTextBoxとLabelをフォームに配置して標準モジュールから
ユーザーフォームを表示させてファイルをD&DしてTEXTボックスに取得までは旨く処理されますが
その次のMsgBoxが表示されずにEXCELの最上部がブリンク状態で停止されたままになります。

原因は何でしょうか ?

'-------------------------------

'UserForm1 のコード

Option Explicit

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)

    TextBox1.Text = URL
    Cancel = True
    Worksheets("Label").Range("H2") = TextBox1.Text
    MsgBox "Worksheets(Label).Range(H2)に取得しました。"
    Unload UserForm1
End Sub
’-----------------------------

'呼び出し側の標準モジュールのコード

Public Sub Main_Form_Show()

    'Excel.Application.Visible = False
    UserForm1.Show vbModeless 'フォームが開いたままの状態でExcelの操作は可能。
End Sub

(初心者のM) 2022/05/05(木) 17:30


質問とは関係しないので、すごくどうでもいい話ですが、サイトの記事を紹介するならURLより記事番号を使ったほうがよいかもです。
 こんな感じ。
[[20181211140007]] 『64bitExcelでフォームにD&Dしたファイルパスの取得方法』(ぷー)

また、好みですが↓のようにすればハイパーリンクにできますよ。

 Typeステートメント									
http://officetanaka.net/excel/vba/statement/Type.htm

 第110回.ユーザー定義型・構造体(Type)									
https://excel-ubara.com/excelvba1/EXCELVBA410.html

 Windows API を使う(Declare ステートメント)
https://excelwork.info/excel/windowsapideclare/

 Declare ステートメント
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/declare-statemen
http://officetanaka.net/excel/vba/statement/Declare.htm

(もこな2) 2022/05/05(木) 17:37


 そうですね^^...テスト
https://www.petitmonte.com/bbs/answers?question_id=23724

 【メモ】お忙しい方はスルーしてください。
http://blogwizhook.blog.fc2.com/blog-entry-250.html
http://ie.vba-ken3.jp/Events/BeforeNavigate2/

(あみな) 2022/05/05(木) 18:02


あなみさん、へ

多分「そうですね^^...テスト」は、私に対する「17:30」への回答(アドバイス)だと思うのですが
初心者の理解不足でまだ伝えたい事が見えていません。

肝は、下記のコードなのかと思いますが
これを改造すればEXCELの最上部がブリンク状態で停止されたまま先に進まないのが解決されるのですか ?

原理が判らずにまだ先が見えません。

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)

    msgbox URL

    If URL <> "http://yahoo.co.jp/" Then
        Cancel = True
    End If

(初心者のM) 2022/05/05(木) 18:35


 (初心者のM)さんへ

 「そうですね^^...テスト」は、(もこな2)さん 2022/05/05(木) 17:37
 への返信を兼ねて、今見てたページのURLを張り付けただけです。

 WebBrowserコントロールの参考文献を見ているだけですよ^^;
 解答ではありません。

(あみな) 2022/05/05(木) 18:55


あなみさんへ、
  URLを貼り付けて頂けるのは有難いことですが

初心者は、それが回答者が参考になる何かを含んでいると判断して掲載しているので
その意味を汲み取ろうとします。
それが、「見つけたので貼っておきます」のスタンスは拍子抜けです。

(初心者のM) 2022/05/05(木) 19:14


 話の流れを見ていただきたいな

 返信なら

 >○○○

 回答

 とします。

 私は、これで降ります。

(あみな) 2022/05/05(木) 19:23


Excelの挙動が変です。

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)

    TextBox1.Text = URL
    Cancel = True
    Worksheets("Label").Range("H2") = TextBox1.Text
    'MsgBox "Worksheets(Label).Range(H2)に取得しました。"
    Unload UserForm1
End Sub

MsgBoxをコメントにするとブリンクしなくなるが
unload UserForm1でユザーフォームを閉じられると
すぐにExcelが一度落ちて回復済みで再起動する。

(同時にExcelが落ちるので、dwwin.exeがWindowsエラー報告を送信しようとしている)

回復済みのEXCELを見ると
Range("H2")にTextBox1.Textに記載されて処理的には問題ない

(初心者のM) 2022/05/06(金) 06:19


 >あなみさん、参考になりそうな
 >あなみさん、へ 
 >あなみさん、へ
 回答者に失礼でしょ。
(VAL) 2022/05/06(金) 09:08

>MsgBoxが表示されずにEXCELの最上部がブリンク状態で停止されたままになります。

Excelがアクティブでないからで、通常動作です。
アクティブにするとmsgboxが表示します。
APIでExcelにアクティブを戻すことも出来ますので、
調べてみては。

>unload UserForm1でユザーフォームを閉じられるとすぐにExcelが一度落ちて回復済みで再起動する。

Excel2016ですが、Excel終了は再現しました。
イベントから抜けてunloadすれば大丈夫かと。
または、Hideなら終了しませんでした。
どうするかは、質問者次第なので、ご自身でロジックを考えられては。

(tkit) 2022/05/06(金) 10:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.