|
▼shousuke さん:
こんばんは。あー、こっちの方が断然速いですね!!
API宣言が抜けていたので、
Public Declare Function GetProfileString Lib "kernel32" Alias _
"GetProfileStringA" (ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
>Public Sub プリンタ名設定()
'Sheets("List").Select これでアクティブシートに表示されますね?
>ActiveSheet.Range("E3:E20").ClearContents
>ActiveSheet.Range("E3").Select
>
>Dim vntArray As Variant, Element As Variant
>Dim intCount As Integer, strPrinter As String, intPos As Integer, strPort As String
>
>'エントリ検索
>vntArray = API_GetProfileString("Devices", vbNullString, "NotFound", 1024, Chr(0))
>
>If IsEmpty(vntArray) = False Then
>
> For intCount = LBound(vntArray) To UBound(vntArray)
>
> 'キー検索
> strPrinter = vntArray(intCount) 'プリンタ名
> Element = API_GetProfileString("Devices", strPrinter, "NotFound", 1024, Chr(0))
>
> If IsEmpty(Element) = False Then
>
> intPos = InStr(1, Element(0), ",")
>'区切り文字(,)位置
> If intPos <> 0 Then strPort = Mid(Element(0), intPos + 1, Len(Element(0)) - intPos)
>
> '====================
> Debug.Print strPort & " on " & strPrinter
> '====================
>'アクティブなセルへプリンタ名を代入する
>
> ActiveCell = strPrinter & " on " & strPort
> ActiveCell.Offset(1, 0).Select 'アクティブセルの移動
>
>
> End If
>
> Next intCount
>
>End If
>
>End Sub
>
>
>'以下は関数***
>Public Function API_GetProfileString(strAppName As String, strKeyName As String, strDefault As String, _
> lngSize As Long, strDelimiter As String) As Variant
>
>Dim strBuf As String '情報を取得するためのバッファ
>Dim lngResult As Long '戻り値
>Dim lngStart As Long, lngPos As Long
>Dim strTemp As String, strArray() As String, intCount As Integer
>
>'On Error Resume Next
>
> '---------------------------------------------------------------------------
> '関数の呼び出し
> '---------------------------------------------------------------------------
> 'WIN.INI からの情報を取得するためのバッファ
> strBuf = Space(lngSize)
>
> 'WIN.INI から指定したエントリないでキーを検索、該当データのバイト数を返す
> lngResult = GetProfileString(strAppName, strKeyName, strDefault, strBuf, lngSize)
>
> '戻り値(テンポラリ)
> strTemp = Trim(Left(strBuf, lngResult))
>
> '---------------------------------------------------------------------------
> '戻り値チェック
> '---------------------------------------------------------------------------
> If strTemp = Empty Then API_GetProfileString = Empty: Exit Function 'キーなし時
> If strTemp = strDefault Then API_GetProfileString = Empty: Exit Function '該当なし時
>
> lngStart = 1: intCount = Empty
>
> '**********
> '複数戻り値の場合のチェック
> Do
> lngPos = InStr(lngStart, strTemp, strDelimiter) 'データ区切り位置検出
>
> If lngPos = 0 And (lngStart > 1) Then Exit Do 'データ区切りなし時終了
>
> If Mid(strTemp, lngStart, 1) <> strDelimiter Then
>
> '区切られたデータを配列に格納
> ReDim Preserve strArray(intCount) As String
> If lngPos = 0 Then
> strArray(intCount) = strTemp
> Else
> strArray(intCount) = Mid(strTemp, lngStart, lngPos - lngStart)
> End If
>
> End If
>
> lngStart = lngPos + 1 '検索開始位置
> intCount = intCount + 1 '配列の要素インデックス増
>
> Loop Until lngPos = 0
> '**********
>
> '戻り値
> API_GetProfileString = strArray
>
>End Function
処理が速いのに活用されないといけないので、コメントしておきます。
|
|