• 締切済み

Excel VBA のコンパイルエラー

Excel VBA で GDI32 にある API を declare するとメモリ不足のコンパイルエラー となってしまいます。 どなたか解決策を御教示下さい。 使用するAPI は GetTextExtentPoint32 です。 コンパイルエラーが起きるVBAコードは、MSのVBサンプルから拾ったものです。 private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" ( _ ByVal hdc As Long, _ ByVal lpsz As String, _ ByVal cbString As Long, _ ByRef lpSize As CSize) As Long Private Type CSize cx As Long cy As Long End Type 同じ GDI32 にある DeleteObject の declare 文はエラーが発生しません。 環境は以下の通りです。 Excel 2007 OSはVista 32bit メモリは 3G で約60%使用 宜しくお願いします。

  • hac
  • お礼率50% (1/2)

みんなの回答

  • angel_Z
  • ベストアンサー率66% (12/18)
回答No.1

参照URLの解説に、「文字列が水平であること」 と書かれておりますが、 セルの書式設定で、文字の角度が付けられていたりしていませんか? 例えば、縦書きになっていたりとか…  推測ですが…その場合、変換してからでないとエラーが起きるのではないでしょか。。。

参考URL:
http://tokovalue.jp/function/GetTextExtentPoint32.htm

関連するQ&A

  • API関係の用語で質問です

    'デバイスコンテキストにオブジェクトを選択する Private Declare Function SelectObject Lib "gdi32" _ (ByVal hDC As Long, ByVal hObject As Long) As Long 'グラフィックスオブジェクトを削除しシステムリソースを開放する Private Declare Function DeleteObject Lib "gdi32" _ (ByVal hObject As Long) As Long ―――――――――――――――――――――――――――――――― VBの初心者です 使うAPIとは別に上のようなSelectObjectや DeleteObjectという関数を 使わなければならないようなのですが これはどういう意味なのでしょうか? またこれはどういうことをしているのでしょうか? ほかの例ではDeleteObjectという関数だけを 使ってSelectObjectを使っていないのも見かけました。

  • VBAでSetTextColorがうまくいかない

    EXCELのVBAでユーザーフォームを使ったグラフィック表示のプログラムを 作っているのですが、SetTextColorでテキスト色の設定をしようと してもうまくいきません。何故か設定しようとする色の値が無視されて 「1304008」が設定されてしまいます。(GetTextColorで確認) そしてそれ以降何を設定してもこの状態のままです。 何か考えられることがありますでしょうか。 下にそのプログラムを示します。 ちなみにSetBKColorやAngleArcなど他のグラフィック命令は問題なく 動いていてSetTextColorだけがうまくいってない状態です。 '------------------------------------------------- ' ユーザーフォーム用プログラム '------------------------------------------------- Private Declare Function GetActiveWindow Lib "user32" () As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, _ ByVal lpszWindow As String) As Long Private Declare Function GetDC Lib "user32" ( _ ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" ( _ ByVal hWnd As Long, _ ByVal hdc As Long) As Long Private Declare Function SetTextColor Lib "gdi32" _ (ByVal hdc As Long, crColor As Long) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _ (ByVal hdc&, ByVal x&, _ ByVal y&, ByVal lpString$, ByVal nCount&) As Long Dim hWnd As Long Dim hdc As Long Public Sub UserForm_Activate() DoEvents hWnd = FindWindowEx(GetActiveWindow, 0, "F3 Server 60000000", "") hdc = GetDC(hWnd) ret = SetTextColor(hdc, RGB(255, 0, 0)) ret = TextOut(hdc, 0, 0, "abc", 3) Call ReleaseDC(hWnd, hdc) End Sub '-------------------------------------------------

  • Excel VBA でのAPI呼び出しが・・・

    マクロ初級です。 windowsXP(SP3) office2007 Excelのマクロで、APIのSetActiveWindowを使おうとしましたが、宣言のところで エラーがでました。  設定は、  Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd As Long) As Long  もしくは  Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd&) As Long  コンパイルエラー  定数、固定長文字列、配列、ユーザ定義型および Declare ステートメントは  オブジェクトモジュールのパブリックメンバとしては使用できません。 ウィンドウをアクティブな状態等に用いたいのですが、定義の仕方が悪いのでしょうか? 皆さま、ご教授下さい。

  • エクセルVBAで2つの画像を比較したい

    こんにちは。VBAの初心者です。 エクセル2003のVBAを使って、シートに読み込んだ縦横24ピクセルの2つの画像(picA、picB)を比較したいと考えています。VBなどのページを参考に、APIのGetPixel関数を使えばなんとかなりそうだというところまではたどり着いて、以下のコードを組んでみたのですが、うまく動きません。 Private Declare Function GetPixel Lib "gdi32" _ (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Sub CommandButton1_Click() Dim picA As Image Dim picB As Image Dim p1 As Integer Dim p2 As Integer Dim ScreenhDC As Long For x = 1 To 24 For y = 1 To 24 p1 = picA.GetPixel(ScreenhDC, x, y) p2 = picB.GetPixel(ScreenhDC, x, y) If p1 <> p2 Then MsgBox "違う画像です" Exit Sub End If Next Next MsgBox "同じ画像です" End Sub 「p1 = picA.GetPixel(ScreenhDC, x, y)」のところで「実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。」というメッセージが出て止まってしまいます。解決法をご教示いただけませんでしょうか。 そもそもエクセルのVBAではAPIは使えないなどということはありますか?

  • API関数 GetPixel

    質問ですが、Visual Basicで Option Explicit Private Declare Function Getpixel Lib "gdi32" (_ ByVal hdc As Long, _ ByVal x As Long, _ ByVal y As Long, _ ) As Long というソース部分があるのですが、これをVC++で書き直すとしたらどのようになるのでしょうか。また、VC++のAPI関数にはGetPixelはないのでしょうか。なにとぞよろしくお願いいたします。

  • エクセル2010 VBAのサウンドの宣言

    エクセル2007でVBAをプログラミングして使っています。 2010で同じVBAを走らすと Public Declare Function apisndPlaySound Lib "WINMM" Alias "sndPlaySoundA" _ (ByVal FileName As String, ByVal SND_ASYNC As Long) As Long とSOUNDの記述の宣言の Function のところで強調表示が出てエラーになります。 2007、2003等ではエラーは出ず使えたのですが、書き換える必要があるようです。 前に進めず困っています。どなたかご教授をよろしくお願いします。

  • 他のアプリケーションの hDC を取得したい

     APIの初歩的なことですみません 他のアプリケーションの hDC を取得して GetPixel() API等 を使用したいのですが どうもうまくいきません hDC や hWnd あたりがよくわからないのが 原因だと思いますが、分かる方教えてください  ソースは以下の様な感じです Private Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long lhWnd = FindWindowA(vbNullString, "ExpApp") lColor = GetPixel(lhWnd, ix, iy)

  • 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のコードを見てくださいますようお願いします。

  • 「コンパイルエラー End Subが必要です。」

    Access2016でファイルを作成しているのですが、下記のVBAを実行しようとすると、「コンパイルエラー End Subが必要です。」とエラーメッセージが返ってきてしまいます。 構文の修正が必要であるとお気づきであれば、その箇所を教えていただけないでしょうか。初歩的な質問で恥ずかしい限りですが、何卒よろしくお願い致します。 Option Compare Database Option Explicit Public Declare PtrSafe Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _ ByVal fuFlags As Long) As Long Public Declare PtrSafe Function GetSystemMenu Lib "user32" _ (ByVal hWnd As Long, ByVal fRever As Long) As Long Public Declare PtrSafe Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal uItem As Long, ByVal fuFlags As Long) As Long Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Const HWND_TOP = &H0 Public Const SC_SIZE = &HF000 Public Const SC_MAXIMIZE = &HF030 Public Const SC_CLOSE = &HF060 Public Const SC_RESTORE = &HF120 Public Const MF_BYCOMMAND = &H0& Public Sub test() Private Sub Form_Open(Cancel As Integer) Dim hWnd As Long hWnd = Application.hWndAccessApp SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE hWnd = GetSystemMenu(hWnd, 0) RemoveMenu hWnd, SC_SIZE, MF_BYCOMMAND End Sub

  • VBAでのカーソル移動とマウスクリック

    業務上の単純作業の自動化のため、VBAから他のアプリケーションを操作することが目的です。 以前、ブラウザ上での作業の時に使用した、下記2つのAPIでは今回はマウスカーソルが指定した座標に動いてくれません、、、 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) この2つのAPI以外で、カーソル移動とマウスクリックを実現する方法は何かありますでしょうか? 色々な方法を教えていただけるとVBAの勉強にもなり幸いです。 ' // 標準モジュール Option Explicit Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Type POINTAPI     x As Long     y As Long End Type Private Sub クリックテスト() Call SetCursorPos(216, 421) Sleep 400 Call mouse_event(&H2, 0, 0, 0, 0) Call mouse_event(&H4, 0, 0, 0, 0) End Sub