• 締切済み

アクティブなプリンターでサポートされている用紙名

http://support.microsoft.com/kb/229718/ja で「アクティブなプリンターでサポートされている用紙名の一覧を取得するマクロ」を見つけたので自分の環境で実行してみました。 OS:Windows XP SP3 アプリケーション: エクセル2002(SP3) 結果はメッセージボックスが表示されるのですが、用紙名のリストが数文字ずつ少なり、リストの最後は「 ) 」の一文字だけになります。またプリンタードライバーがリストする用紙の種類よりも少なくなっています。文字数がなくなったのだと思いますが・・・・・ active printerを取得→そのプリンタードライバを開く→ドライバーが持っている用紙の数を取得→For~Nextでテキストに追加→メッセージボックスで表示しているだろうことはわかるのですが、得られる結果(用紙名の文字数が減少する)がわかりません。 どこをどのように直せば用紙名(できれば「サイズ」「用紙名の番号」も)取得できるでしょうか? さらに言えば、メッセージボックスでなくワークシートのセルに書き出したいです。 お知恵をお貸しください。 該当のコードは以下のとおりです。 Option Explicit Private Declare Function OpenPrinter Lib "winspool.drv" Alias _ "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _ ByVal pDefault As Long) As Long Private Declare Function ClosePrinter Lib "winspool.drv" ( _ ByVal hPrinter As Long) As Long Private Declare Function DeviceCapabilities Lib "winspool.drv" _ Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _ ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _ ByVal dev As Long) As Long Private Const DC_PAPERNAMES = 16 ' Value obtained from wingdi.h Sub GetPaperList() ' Display a message box with the name of the active printer and a list ' of papers it supports. Dim lPaperCount As Long Dim lCounter As Long Dim hPrinter As Long Dim sDeviceName As String Dim sDevicePort As String Dim sPaperNamesList As String Dim sNextString As String Dim sTextString As String Dim iNumPaper() As Integer GetPrinterNameAndPort sDeviceName, sDevicePort If OpenPrinter(sDeviceName, hPrinter, 0) <> 0 Then ' Get count of paper names supported by active printer. lPaperCount = DeviceCapabilities(sDeviceName, _ sDevicePort, _ DC_PAPERNAMES, _ ByVal vbNullString, 0) ReDim iNumPaper(1 To lPaperCount) sPaperNamesList = String(64 * lPaperCount, 0) ' Get paper names supported by active printer. lPaperCount = DeviceCapabilities(sDeviceName, _ sDevicePort, _ DC_PAPERNAMES, _ ByVal sPaperNamesList, 0) ' List available paper names. sTextString = "Paper available for " & ActivePrinter For lCounter = 1 To lPaperCount ' Get a paper name. sNextString = Mid(sPaperNamesList, _ 64 * (lCounter - 1) + 1, 64) sNextString = Left(sNextString, _ InStr(1, sNextString, Chr(0)) - 1) ' Have one paper name. sNextString = String(6 - Len(CStr(iNumPaper(lCounter))), _ " ") & sNextString ' Add paper name to text string for message box. sTextString = sTextString & Chr(13) & sNextString Next lCounter ClosePrinter (hPrinter) ' Show paper names in message box. MsgBox sTextString Else MsgBox ActivePrinter & " <Unavailable>" End If End Sub Private Sub GetPrinterNameAndPort(printerName As String, _ printerPort As String) ' ActivePrinter yields a name of the form "Printer XYZ on LPT1" while the ' DeviceCapabilities function requires a printer name and port. ' ' Out: ' printerName Printer name derived from ActivePrinter property ' printerPort Printer port derived from ActivePrinter property Dim sString As String Const searchText As String = " on " sString = ActivePrinter printerName = Left(sString, InStr(1, sString, searchText) - 1) printerPort = Right(sString, _ Len(sString) - Len(printerName) - Len(searchText)) End Sub ※support.microsoft.comのサンプルコードなのに・・・・

みんなの回答

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.1

> ※support.microsoft.comのサンプルコードなのに・・・・ 機械翻訳のページですから、 当然、2バイトコードを含む日本語に対応するカスタマイズなどされていませんね。 こちらは Access用ですが、日本語対応です。 プリンタが印字できる用紙名 IDの取得 http://www.geocities.jp/shaku_tyo/tip/050609.htm ちょこっと修正すれば Excel でも動きます。 【修正点】 ・データベースではないので、DAO の参照設定は不要。 ・db、rs の定義不要。 ・結果を Access のテーブルに書き出すロジック不要。 ・Access の Printer オブジェクトの機能は Excel の ActivePrinter には存在しないので  プリンタ名を取得するロジックは Microsoft のものを使用する。 ・Excel のシートに書き出す機能を追加。 以上。 > さらに言えば、メッセージボックスでなくワークシートのセルに書き出したいです。 これが自力でできないレベルでは、「ちょこっと修正」は無理かな? 大サービス、用紙のID と 用紙名を 現在のシートに書き出します。 ------------------------------------------ Option Explicit ' プリンタデバイスドライバの能力を取得する関数の宣言 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long ' ある位置から別の位置にメモリブロックを移動する関数の宣言 Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) ' DeviceCapabilities function constants. Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Sub GetPaperList() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long ' Excel用 GetPrinterNameAndPort strDeviceName, strDevicePort ' 問い合わせる内容を指定 ' バッファに必要なサイズを取得 lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ' バッファ確保 ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) '用紙名を取得 DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString 'paper numbers を取得 lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) '用紙名を列挙 For lngCounter = 0 To lngPaperCount - 1   ' 用紙名コピー   MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64   ' 用紙名追加   'Debug.Print Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) & " " & aintNubytPaper(lngCounter + 1)   ' Excel用   Cells(lngCounter + 1, 1) = aintNubytPaper(lngCounter + 1)   Cells(lngCounter + 1, 2) = Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter MsgBox "取得完了" End Sub Private Sub GetPrinterNameAndPort(printerName As String, _                printerPort As String) ' ActivePrinter yields a name of the form "Printer XYZ on LPT1" while the ' DeviceCapabilities function requires a printer name and port. ' ' Out: ' printerName Printer name derived from ActivePrinter property ' printerPort Printer port derived from ActivePrinter property    Dim sString As String   Const searchText As String = " on "   sString = ActivePrinter   printerName = Left(sString, InStr(1, sString, searchText) - 1)   printerPort = Right(sString, _      Len(sString) - Len(printerName) - Len(searchText)) End Sub シートをクリアしたりなどという処理は含まれていません。 あとは、ご自由にカスタマイズしてください。 しゃくさんに感謝!

関連するQ&A

  • ExcelでDeviceCapabilitie

    ExcelでAPIを使用して、用紙番号を取得したいと考えています。 Excel2007(OS Win7)上では取得できるのですがExcel2000(OS WinXP)上ではエラー。 GetPrinterNameAndPortで、『 on 』と『 の 』がバージョンによって変えてもダメでした。アドバイスよろしくお願い致します。 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort strDeviceName, strDevicePort lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) For lngCounter = 0 To lngPaperCount - 1 MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 MsgBox aintNubytPaper(lngCounter + 1) & " & " & Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub Private Sub GetPrinterNameAndPort(printerName As String, printerPort As String) Dim sString As String Const searchText As String = " on " ←使い分け ' Const searchText As String = " の " sString = ActivePrinter printerName = Left(sString, InStr(1, sString, searchText) - 1) printerPort = Right(sString, Len(sString) - Len(printerName) - Len(searchText)) End Sub

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

    エクセルのマクロでプリンタ名を取得しています エクセルの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

  • プリントサーバーに登録してある用紙サイズの取得

    いつもご参考にさせて頂いております。 現在Accessにて印刷を行っています。 そこで現状Accessを立ち上げた時に用紙サイズとそのIDを取得する様にしていますが、通常使うプリンタの用紙サイズしか見に行きません。 プリントサーバーにある全ての用紙サイズとIDを取得する方法はあるのでしょうか? どなたかご教授宜しくお願い致します。 OS:Vista , Access2007 プリンタはドットとレーザーを使用しています。 もし下記以外にもっといい方法があれば、是非ご教授宜しくお願い致します。 'プリンタデバイスドライバの能力を取得する関数の宣言 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long 'ある位置から別の位置にメモリブロックを移動する関数の宣言 Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 'DeviceCapabilities function constants. Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Private Sub Form_Load() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long Dim db As Database Dim rs As Recordset '用紙サイズと番号を保存するテーブルの削除 DoCmd.RunSQL "DELETE * FROM [T_PaperSize]" Set db = CurrentDb Set rs = db.OpenRecordset("T_PaperSize") With Printer strDeviceName = .DeviceName strDevicePort = .Port End With '問い合わせる内容を指定 'バッファに必要なサイズを取得 lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, _ ByVal vbNullString, ByVal vbNullString) ' バッファ確保 ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) '用紙名を取得 DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString '用紙IDを取得 lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) '用紙名を検索 For lngCounter = 0 To lngPaperCount - 1 '用紙名コピー MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 ' 用紙名追加 'Debug.Print Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) & " " & aintNubytPaper(lngCounter + 1) rs.AddNew rs![ID] = aintNubytPaper(lngCounter + 1) rs![用紙名] = Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) rs.Update Next lngCounter End Sub

  • Excelで用紙番号取得

    Excel2000 VBAで用紙番号を取得しようと考えています。 調べてみたのですが、APIのDeviceCapabilities()が使用できそうな感じというのは解ったのですが、 バッファというのがいまいち解らず使えません。 出力バッファやデバイスデータのバッファとは何を指してるのでしょうか? また、以下コードをExcel2000で実行するとエラーになります。 やはりバッファの使い方がおかしいのでしょうか? アドバイスよろしくお願いいたします。 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort sDeviceName, sDevicePort ' バッファに必要なサイズを取得 lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ' バッファ確保 ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) '用紙名を取得 DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString 'paper numbers を取得 lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) '用紙名を列挙 For lngCounter = 0 To lngPaperCount - 1 ' 用紙名コピー MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 ' 用紙名追加 MsgBox aintNubytPaper(lngCounter + 1) MsgBox Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub

  • IMEの単語登録について

    テキストボックスに文字を入力して、確定と同時にIMEの単語登録辞書を表示せずに、辞書に登録するプログラムを作っているのですが、うまく出来ずにいます。途中のプログラムを載せますので間違いがありましたら教えていただけないでしょうか? Private Declare Function GetKeyboardLayout_ Lib "user32" (ByVal idThread As Long) As Long_ Private Declare Function ImmRegisterWord_ Lib "Imm32.dll" Alias "ImmRegisterWordA" _ (ByVal hKL As Long, ByVal lpszReding As String,_ ByVal dwStyle As Long, ByVal lpszRegisterAs_ String) As Long Private Sub Label6_Click() Dim hKL As Long Dim lpszReading As String '単語の読み Dim lpszRegister As String '単語の語句 Dim dwStyle As Long '単語の品詞   hKL = GetKeyboardLayout() lpszReading = Text1.Text 'Text1に入力された            単語をlpszReadingに格納 lpszRegister = Text1.Text 'Text1に入力された            単語をlpszRegisuterに格納 ImmRegisterWord hKL, lpszReading, dwStyle,       lpszRegister '読み・語句をIME辞書に登録 End Sub です。よろしくお願いします。

  • VBAのwav操作ついて!!

    エクセルのVBAでプログラムを作っているのですが、wavを操作することに関してわからないことがあります。 (general)に -------------------------------------------------------- Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long Private Const FILE001_NAME As String = "C:\001.wav" Private Const FILE002_NAME As String = "C:\002.wav" ・・・ ------------------------------------------------------- というのを入れていまして、音を出したいところで Call mciSendString("play """ & FILE○_NAME & """", "", 0, 0) という方式でwavを再生させようと思っています。 ここで、FILEのあとをワークシート1上のA1セル上の数字に変えたいと思います。つまり、A1セル内の数(乱数で1~100のいずれかを表示させています)を○のところに入れるにはどうすればいいでしょうか? どなたかおわかりになる方、教えてください。お願いいたします。

  • プリンタの印刷ジョブを削除したい。

    プリンタの印刷ジョブを削除したい。 現在、VB.NET(Visual Studio 2008)で開発を行っています。 SetPrinter関数を使用して、印刷ジョブを全て削除したいのですがSetPrinterに失敗してしまいます。 GetLastErrorの戻り値は「5」でアクセス拒否のようです。 SetPrinterの前にOpenPrinterは成功しており、プリンタの印刷ジョブの情報は取得できています。 なお、同環境でVB6.0で同様のプログラムを作成し実行したところジョブの削除ができました。 類似した現象・解決方法等ご存知でしたら教えてください。 開発環境はWindowsXP、Visual Studio 2008です。 以下、ソースの抜粋です。 '宣言 Private Const DEF_INIT_BUFFER_PERFORM As Integer = 100 Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 Public Const PRINTER_ACCESS_ADMINISTER = &H4 Public Const PRINTER_ACCESS_USE = &H8 Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE) Public Structure PRINTER_DEFAULTS Public pDatatype As IntPtr Public pDevMode As IntPtr Public DesiredAccess As Integer End Structure <DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> _ Private Shared Function OpenPrinter( _ ByVal pPrinterName As String, _ ByRef hPrinter As IntPtr, _ ByVal pDefault As PRINTER_DEFAULTS _ ) As Boolean End Function <DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> _ Private Shared Function SetPrinter( _ ByVal hPrinter As IntPtr, _ ByVal Level As Long, _ ByVal pDefault As IntPtr, _ ByVal Command As Long _ ) As Boolean End Function '実行部 Dim pd As New PRINTER_DEFAULTS pd.DesiredAccess = PRINTER_ALL_ACCESS Dim printerHandle As IntPtr Dim ret As Boolean = OpenPrinter("プリンタ名", printerHandle, pd) Dim err As Integer = Marshal.GetLastWin32Error() 'Falseが返る ret = SetPrinter(printerHandle, CLng(0), IntPtr.Zero, CLng(3)) '5が返る err = Marshal.GetLastWin32Error()

  • VB6 APIを使った文字印刷について

    VB6でAPI(TextOut)を使って印刷する必要があるのですが、インターネットで調べたらサンプルがあってそれを参考にさせてもらおうと思っています。 ただ、当方としては、印刷位置と印刷文字サイズをmmで指定したく、色々試しているのですがうまくいきません。お分かりになる方どこがおかしいかご教示願えないでしょうか? サンプルのソースコードを以下に張っておきます。formにCommandボタンを一つ張ってください。 Option Explicit Dim FX As Integer 'フォントの横サイズ Dim FY As Integer 'フォントの縦サイズ Dim cx As Long '表示X座標 Dim cy As Long '表示Y座標 Private Const DEFAULT_CHARSET = 1 Private Const OUT_DEFAULT_PRECIS = 0 Private Const DEFAULT_QUALITY = 0 Private Const DEFAULT_PITCH = 0 Private Const FF_DONTCARE = 0 Private Const LF_FACESIZE = 32 Private Type Size cx As Long cy As Long End Type Private Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long lfItalic As Byte lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte lfPitchAndFamily As Byte lfFaceName(LF_FACESIZE) As Byte End Type 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 Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As Size) As Long Private Sub Command1_Click() Printer.Print "" '文字印刷位置縦0mm 文字幅6mm、文字高6mmで印刷 FX = 6: FY = 6 cx = 0: cy = 0 PrintText "testてすと1" '文字印刷位置縦50mm 文字幅6mm、文字高12mmで印刷 FX = 6: FY = 12 cx = 0: cy = 50 PrintText "testてすと2" '縦倍角 '文字印刷位置縦200mm 文字幅12mm、文字高6mmで印刷 FX = 12: FY = 6 cx = 0: cy = 100 PrintText "testてすと3" '横倍角 Printer.EndDoc End Sub Sub PrintText(text As String) Dim LF As LOGFONT Dim IX As Integer Dim TempByteArray() As Byte Dim ByteArrayLimit As Long Dim OldFT As Long Dim NewFT As Long Dim rtn As Long Dim hdc As Long Dim PX As Long Dim PY As Long hdc = Printer.hdc '↓(1)ここで文字印刷位置をmmかTwipに変換しているつもりなのですが・・・ PX = Printer.ScaleX(cx, vbMillimeters, vbTwips) PY = Printer.ScaleY(cy, vbMillimeters, vbTwips) With LF .lfEscapement = 0 '文字の回転角度(角度*10) '↓(2)ここで文字サイズをmmかTwipに変換しているつもりなのですが・・・ .lfHeight = Printer.ScaleY(FY, vbMillimeters, vbTwips) '文字の高さ .lfWidth = Printer.ScaleX(FX, vbMillimeters, vbTwips) '文字の幅 .lfWeight = 400 '文字の太さ .lfItalic = False '斜体 .lfUnderline = False '下線 .lfStrikeOut = False '取り消し線 .lfCharSet = DEFAULT_CHARSET .lfOutPrecision = OUT_DEFAULT_PRECIS .lfClipPrecision = OUT_DEFAULT_PRECIS .lfQuality = DEFAULT_QUALITY .lfPitchAndFamily = DEFAULT_PITCH Or FF_DONTCARE TempByteArray = StrConv("MS ゴシック", vbFromUnicode) ByteArrayLimit = UBound(TempByteArray) For IX = 0 To ByteArrayLimit .lfFaceName(IX) = TempByteArray(IX) Next End With NewFT = CreateFontIndirect(LF) OldFT = SelectObject(hdc, NewFT) TextOut hdc, PX, PY, text, LenB(StrConv(text, vbFromUnicode)) rtn = SelectObject(hdc, OldFT) rtn = DeleteObject(NewFT) End Sub 以上よろしくおねがいします。

  • VB.netでパスワード変更

    下記のようなパスワードを変更するフォームをVB.netで作成したのですが、 実行すると、いつも異なるretValの値がかえってきて変更できません。 retValの値もよくわからない大きな数値がかえってくるのでどのようなエラーかも 判断つかず。 どこが間違っているかお分かりになる方いらっしゃいますでしょうか。 Public Class Form1 Private Declare Function NetUserChangePassword Lib "netapi32.dll" (ByVal Domain As String, ByVal User As String, ByVal OldPass As String, ByVal NewPass As String) As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim retVal As Long Dim sDomain As String Dim sUser As String Dim sOldPass As String Dim sNewPass As String sDomain = "xxxxxxx" ←ここはサーバのIPアドレス sUser = TextBox1.Text sOldPass = TextBox2.Text sNewPass = TextBox3.Text retVal = NetUserChangePassword(sDomain, sUser, sOldPass, sNewPass) MsgBox(retVal) End Sub End Class

  • WinAPIで電卓をクリック

    現在、WinAPIを勉強しており、練習としてVBAを用いて、電卓アプリのボタンをクリックしようとしています。 キーを送るのではなく、クリックで行いたいたいと 考えています。 ボタンのハンドルを取得するところまではできましたが、sendMessageでクリックできず、EditBoxに数字が 入りません。 どのようにすればよいのかご教授ください。 よろしくお願い致します。 環境: WinXP home、 Excel2002、Win付属アプリの電卓v5.1 ---作成したプログラム---- '標準モジュールの中身 Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Sub Main() Dim lngWindWnd As Long 'ウィンドウハンドル Dim ret As Long Dim hCalc As Long 'アプリケーションタイトルより、ウィンドウハンドルを得ます lngWindWnd = FindWindow(vbNullString, "電卓") '8ボタンのハンドル(確実に取れていることを確認 hCalc = FindWindowEx(lngWindWnd, 0, "Button", "8") ret = SetForegroundWindow(lngWindWnd) ret = SendMessage(hCalc, WM_LBUTTONDOWN, 0, 0) End Sub

専門家に質問してみよう