こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2010-12-23 22:15:19

QNo.6403373

すぐに回答ほしいです

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

●Excelで用紙番号取得
http://okwave.jp/qa/q6399905.html
の方の [ANo.2] に対する [補足] を拝見いたしました。

>バッファ確保の所で、
>『インデックスが有効ではありません』
>と出ます。
とのことですが、当該箇所が
ReDim bytPaper(64 - 1, lngPaperCount - 1)
になりますよね?

 私の環境(Windows XP Pro SP3 & Excel 2003)では問題なく動くようです。

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

 ところで、問題なく動く場合は、VBE で Numbertest を ステップ イン デバッグ していくと、「lngPaperCount」の値は、
lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString)
のところで「0」から "求めたい数値" に変化するようです。

 ところが、GetPrinterNameAndPort で適正な値が取得できなかった場合は、同じところで「0」から「-1」に変ります。
 つまり、
ReDim bytPaper(64 - 1, -1 - 1)
となりますので、
実行時エラー '9':
インデックスが有効範囲にありません。
となります。

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

 さて、前置きが長くなりましたが、
>GetPrinterNameAndPortで、『 on 』と『 の 』が
>バージョンによって変えてもダメでした。
とのことですが、そもそも「ActivePrinter」の値が バージョン によってどう変るのかを、よくご覧になった方がよさそうです。

 ちなみに、私の環境では、
ActivePrinter : "Canon iP4700 series on Ne03:"
となるのですが、
●[XL2000]ActivePrinterで取得した文字列が以前のバージョンと異なる
http://support.microsoft.com/kb/414210/ja
によると、Excel 2000 では
ActivePrinter : "Ne03: の Canon iP4700 series"
となるのではないかと思われます。

 つまり、
>『 on 』と『 の 』がバージョンによって変え
るだけではなくて、
<プリンタ名> on <ポート名>

<ポート名> の <プリンタ名>
とを使い分けなければならない、ということになろうかと存じますが、いかがでしょうか?

Private Sub GetPrinterNameAndPort(printerName As String, printerPort As String)
 Dim sString As String
 sString = ActivePrinter
 If InStr(1, sString, " on ") > 0 Then
  printerName = Left(sString, InStr(1, sString, " on ") - 1)
  printerPort = Right(sString, Len(sString) - Len(printerName) - Len(" on "))
 Else
  printerName = Right(sString, Len(sString) - Len(printerName) - Len(" の "))
  printerPort = Left(sString, InStr(1, sString, " の ") - 1)
 End If
End Sub

投稿日時 - 2010-12-24 08:40:10

補足

非常に詳しいアドバイスありがとうございます。
現在、外出中なので、テスト出来ませんが、帰宅したら即試したいと思います。

ずっと悩んでいましたが、ようやく光が見えました。
本当にありがとうございます。

テスト結果をまたレポ致します。

投稿日時 - 2010-12-24 09:29:30

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問