• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:強制終了・フリーズしてしまう)

エクセルが強制終了・フリーズする問題

このQ&Aのポイント
  • エクセルを新規に立ち上げ、標準モジュールにコードを貼り付けて実行すると、2003ではエクセルが閉じられ、変更の確認が表示されません。一方、2007では画像の画面が表示されます。このコードはパソコン名を取得するコードだと思っていたが、実はエクセルを強制的に閉じるコードだったのか?他のAPIを使って解決する方法はあるのか?
  • エクセルを新規に立ち上げ、標準モジュールにコードを貼り付けて実行すると、2003ではエクセルが強制終了し、変更の確認が表示されません。一方、2007では画像の画面が表示されます。このコードはパソコン名を取得するコードだと思っていたが、実はエクセルを強制的に閉じるコードだったのか?他のAPIを使って解決する方法はあるのか?
  • エクセルを新規に立ち上げ、標準モジュールにコードを貼り付けて実行すると、2003ではエクセルがクラッシュし、変更の確認が表示されません。一方、2007では画像の画面が表示されます。このコードはパソコン名を取得するコードだと思っていたが、実はエクセルを強制的に閉じるコードだったのか?他のAPIを使用して問題を解決できるのか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

私も、API は相当に怪しいのですが (^^ゞ これは領域を確保してからでないとダメですね。 これなら OK でした。 Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _ (ByVal lpBuffer As String, nSize As Long) As Integer Sub ahtGetComputerName() Dim str As String * 255 Dim rtn As Long rtn = GetComputerName(str, 16) MsgBox str End Sub 蛇足ですがコンピュータ名ならVBAで関数が用意されています。 environ("computerName") で得られます。

uwhodlvj
質問者

お礼

領域の確保と言うコードが必要なのですね。 Dim str As String * 255 このような変数の宣言の仕方があるのですか。 Environは環境変数ですよね。 APIを使わなくても Sub test() Debug.Print Environ("computerName") End Sub でコンピューター名が取得できました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

http://homepage1.nifty.com/MADIA/vb/API/GetComputerName.htm 私には何がどう違って、クラッシュする原因はわかりませんが

uwhodlvj
質問者

お礼

うまく出来ました。 しかし仕組みがよくわかりません。 「'バッファを確保」って何のためにするんでしょねー?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル VBAでコンピューター名を所得・・・

    いつも皆様には大変お世話になっております。 今回の質問は コンピューター名を所得する方法についてなのですが、 Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _ (ByVal lpBuffer As String, nSize As Long) As Long Public Sub コンピュータ名() Dim nBuffer As String * 16 Call GetComputerName(nBuffer, Len(nBuffer)) MsgBox Left(nBuffer, InStr(nBuffer, vbNullChar) - 1) End Sub 通常時はこれで動くのですが、 やりたいのが ボタン→ユーザーフォームコマンドボタンの流れで作りたいのです。 Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _ (ByVal lpBuffer As String, nSize As Long) As Long Private Sub CommandButton1_Click() Dim nBuffer As String * 16 Call GetComputerName(nBuffer, Len(nBuffer)) MsgBox Left(nBuffer, InStr(nBuffer, vbNullChar) - 1) End Sub と作ると、上の2行で止まってしまいます。 多分上の2行をどこか別のところに書けばいいのかな?と思うのですが、どこに書いてもエラー出まくりです。 どなたか私に愛の手をお願い致します。

  • VB2008 iniファイルの全セクション取得方法

    こんばんわ。iniファイルの全セクションを取得したく、 以下のコードを使うことはわかったのですが、ここから先がVB初心者の為全く解かりません。ボタン1を押したらC:\Test.ini のファイルの全セクションを取得というコードはどのように記入すればよいのでしょうか。 どうぞ宜しくお願いいたします。 Declare Function GetPrivateProfileSectionNames Lib "Kernel32.dll" _ Alias "GetPrivateProfileSectionNamesA" _ (ByVal lpszReturnBuffer As String, ByVal nSize As Long, _ ByVal lpFileName As String) As Long

  • 64ビットエクセルでのAPI宣言/PtrSafe

    エクセルのInputboxで、入力された文字列を自動的にアスタリスクで隠すようにする方法を探し http://okwave.jp/qa/q2371878.html の回答No1のコードがまさに最適なコードで、これまで非常に助かっていました。 ところが、64bitのエクセルでは動かないことがわかりました。 表示されたエラーメッセージの言葉から調べて、PtrSafeという言葉を入れなければならないようなのでAPI宣言を以下のようにしてみました。 #If VBA7 And Win64 Then '64ビット版 Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long #Else '32ビット版 Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long #End If ところが、回答No1のコードで Sub Report_Open() を実行すると Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _ Optional YPos, Optional HelpFile, Optional Context) As String のところがハイライトされてエラーになります。 どう直せば良いのでしょうか? 全文のコードを乗せると字数制限に引っかかりますので、申し訳ありませんが宣言以外の部分は http://okwave.jp/qa/q2371878.html の回答No1のコードを見てくださいますようお願いします。

  • VBAにおける Option Explicitの役割

    VBAにおける Option Explicitの役割 VBAでゲームを作ることを勉強している初心者です。 本に従ってもっとも基本的なスロットゲームをためしました。 プログラム本体の前にある下記のOption Explicitを省くとコンパイルエラーになります。 VBAにおける Option Explicitはプログラム本体中にあるどのキーがどのスロットを止めるなどの指示を 具体的記述なしに有効にするなどの役目があるのでしょうか。 Option Explicit Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function GetTickCount Lib "kernel32" () As Long 'Windows起動後経過時間取得API どなたか教えていただけると助かります。 よろしくお願いいたします。

  • APIを使う時は参照設定は不要?

    例えば Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub test() Dim Handle As Long Handle = FindWindow("IEFrame", vbNullString) Debug.Print Handle End Sub と言うコードでウィンドウハンドルを取得する場合、 参照設定のどこにもチェックを入れませんが、なぜ参照設定しなくても使えるのでしょうか? Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long が参照設定の代わりになるのですか?

  • エクセルのマクロで教えて下さい

    エクセルのマクロでプリンタ名を取得しています エクセルの32ビット版と64ビット版で共用できるように下記の記述をしたのですが 32ビット版は問題ないのですが、64版ではエラーが発生します エラーの原因がわかれば教えて下さい Option Explicit 'このEnumprintersとMoveMemoryがWin32 API の宣言です。 #If VBA7 And Win64 Then Type PRINTER_INFO_1 flags As LongPtr pPDescription As LongPtr pName As LongPtr pComment As LongPtr #Else Type PRINTER_INFO_1 flags As Long pPDescription As Long pName As Long pComment As Long End Type #End If Private Const PRINTER_ENUM_LOCAL = &H2 #If VBA7 And Win64 Then Private Declare PtrSafe Function Enumprinters Lib "WINSPOOL.DRV" Alias "EnumPrintersA" _ (ByVal flags As LongPtr, ByVal Name As String, ByVal Level As LongPtr, pPrinterEnum As Any, _ ByVal cdBuf As LongPtr, pcbNeeded As LongPtr, pcReturned As LongPtr) As Long Private Declare PtrSafe Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _ (Dest As Any, Source As Any, ByVal length&) #Else Private Declare Function Enumprinters Lib "WINSPOOL.DRV" Alias "EnumPrintersA" _ (ByVal flags As Long, ByVal Name As String, ByVal Level As Long, pPrinterEnum As Any, _ ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long Private Declare Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _ (Dest As Any, Source As Any, ByVal length&) #End If

  • Excel VBAでアプリのウィンドウ名取得

    WindowsXP, Excel2007で、ExcelからIE8にキーコードを送りたいです。 ネットで拾った以下のコードにより、 Option Explicit Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Function activate_win(win_name As String) As Long Dim hwindow As Long hwindow = FindWindow(vbNullString, win_name) If hwindow <> 0 Then SetForegroundWindow hwindow activate_win = hwindow End Function Call activate_win("ウィンドウ名") Sendkeys "ABC", True のような形で、メモ帳での動作は確認したのですが、 IEだとウィンドウがアクティブになってくれません。 おそらくウィンドウタイトルを間違えているのだと思われますが、 全角半角などを変えてみたりしても、どう見比べてみても間違いがわかりません。 見た目ではわからない、似た文字だが違うということではないかと思っています。 そこで、開いているアプリのウィンドウ名すべてをメモ帳に書き出すような (あるいは任意のアプリにペーストできるようにするような)コードはないでしょうか? よろしくお願いします

  • activebasicについて

    activebasicの中級者のものです。 ActivebasicにてWindowsPCのログイン中のユーザー名というのは取得できるのでしょうか。 Activebasicのヘルプを見て、サンプルコードをコピー、コンパイルしたものの、エラーが大量発生し、、、、。 ということでお願いします_(._.)_ 【サンプルコード】 http://www.activebasic.com/help_center/Pages/API/SystemService/SystemInformation/GetUserName.htm Declare Function GetUserName Lib "kernel32" Alias "GetUserNameA" _ (lpBuffer As BytePtr, _ ByRef nSize As Long) As Long lpBuffer 【ページ内の解説の意味もさっぱり分かりません(´;ω;`)】 Win32API: GetUserName ユーザー名を取得します。 定義 Declare Function GetUserName Lib "kernel32" Alias "GetUserNameA" _ (lpBuffer As BytePtr, _ ByRef nSize As Long) As Long lpBuffer 文字列バッファへのポインタを指定します。このバッファにユーザー名が格納されます。 nSize (ポインタ参照) lpBuffer パラメータで指定したバッファのバイト数が格納されている、32ビット整数型変数へのポインタを指定します。 関数が成功すると、取得したユーザー名のバイト数が格納されます。 戻り値 関数が成功すると、TRUE が返ります。失敗すると、FALSE が返ります。 環境情報 インクルード ファイル: api_system.sbp 内で定義済み DLLファイル: advapi32.dll よろしくお願いいたします。

  • iniファイルの全セクションを取得し、ListBoxのitemにするには?VB2008

    こんにちは。VB2008を使用しています。 「Formロード時にiniファイルの全セクションを取得し、セクション1つずつをlistboxの項目にする」 という流れのコードを作成したいのですが、うまくいきません。 似たような質問などを調べてつぎはぎしてみたものの、うまく理解できなく困っています。 以下、現在記述中のコードです。 'APIの宣言 Declare Function GetPrivateProfileSectionNames Lib "Kernel32.dll" _ Alias "GetPrivateProfileSectionNamesA" _ (ByVal lpszReturnBuffer As string, ByVal nSize As Integer, _ ByVal lpFileName As String) As String 'form1ロード時 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim listboxsec As String Dim listboxitem() As String listboxsec.Capacity = 256 GetPrivateProfileSectionNames(listboxsec, 256, "./FileTest.ini") listboxitem = Split(listboxsec, "\") End Sub 最初の全セクションの取得方法がイマイチ分からない状況です。iniファイルは実行プログラムと同じ場所においてあります。 取得したセクションをSplitで配列に分け、for文でlistboxに追加していこうかと考えています。 どのような記述をすればいいのか、ご教示お願いいたします。

  • EXCELVBA フォルダ検索API

    エクセルからVBAでフォルダを選択させるコマンドを、APIを使ってフォルダ検索ダイアログボックスを出すまでは見よう見真似でできるのですが、このとき「あたらしいフォルダ」のボタンは必要ないので出したくないのですが、どこかに定数を指定すればよろしいかご存知でしたら教えてください。 (使用OS: Windows2000,Excel:2003) ちなみにコピペした宣言部分は以下のものです。 *************** Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _ (ByVal pidl As Long, ByVal pszPath As String) As Long Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _ (lpBrowseInfo As BROWSEINFO) As Long Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long) Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Public Const WM_USER = &H400 Public Const BFFM_SETSELECTIONA = (WM_USER + 102) Public Const BFFM_INITIALIZED = 1 ********************

専門家に質問してみよう