介绍

首先 - 对不起我的英语 - 我是 excel vba 的新手。

我有一个 Excel 用户表单,其中包含一些文本框、2 个列表框和 1 个按钮。 如果我单击按钮,它会打开一个文件对话框,然后我选择一个 printer.inf 安装文件。 我试图读取几个打印机 inf 文件,但我无法访问/修剪 Line77 中的字符串。 首先我得到制造商,这有效。 然后我想弄清楚它是否只有 86 个或 64 个驱动程序,并将其与制造商进行比较以设置一个新变量。 使用此变量,我想研究该部分并获取每个打印机项目并将其设置为 ListBox。 但它无法确定它是 86 还是 64 或两者兼而有之,并将其与制造商与新变量进行比较。 在 Line77 中是我想要让字符串搜索 86 或 64 并在最多两个新变量中修剪它的变量。

代码

Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias _
    "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, _
    ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long

Function IniFileName() As String  
  With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Add "INF Files", "*.inf", 1
        .Show
        fullpath = .SelectedItems.Item(1)
    End With
  IniFileName = fullpath
End Function

Public Function GetFilenameFromPath(ByVal strPath As String) As String
    If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
        GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
    End If
End Function

Function ReadIniFileString(ByVal Sect As String, ByVal Keyname As String, ByVal infFileName As String) As String
    Dim Worked As Long
    Dim RetStr As String * 128
    Dim StrSize As Long

  iNoOfCharInIni = 0
  sIniString = ""
  If Sect = "" Or Keyname = "" Then
    MsgBox "Section Or Key To Read Not Specified !!!", vbExclamation, "INI"
  Else
    sProfileString = ""
    RetStr = Space(128)
    StrSize = Len(RetStr)
    Worked = GetPrivateProfileString(Sect, Keyname, "", RetStr, StrSize, infFileName)
    If Worked Then
      iNoOfCharInIni = Worked
      sIniString = Left$(RetStr, Worked)
    End If
  End If
  ReadIniFileString = sIniString
End Function

Function ReadIniSection(ByVal Filename As String, ByVal Section As String) As String
    Dim RetVal As String * 255, v As Long
    v = GetPrivateProfileSection(Section, RetVal, 255, Filename)
    ReadIniSection = Left(RetVal, v + 0)
End Function

Private Sub btn01_Click()

'GET FILENAME
strIniFileName = IniFileName
strGetFilenameFromPath = GetFilenameFromPath(strIniFileName)

'GET ATTRIBUTES OF INF FILE
strClass = ReadIniFileString("Version", "Class", strIniFileName)

If strClass = "Printer" Then
    Dim S As String
    S = ReadIniSection(strIniFileName, "Manufacturer")
    Dim vLines As Variant
    vLines = Split(S, Chr$(0))
    Dim vLine As Variant
    For Each vLine In vLines
        If vLine <> "" Then
        'MsgBox vLine
            strlength = Len(vLine)
            Pos1 = InStr(vLine, "=")
            'MsgBox "pos1: " & Pos1
            pos2 = Mid(vLine, Pos1 + 1, strlength - Pos1)
            strManufacturer = Left(pos2, InStr(1, pos2, ",") - 1)
            '---> PROBLEM strDriverVersions
            strDriverVersions = Right(pos2, Len(pos2) - Len(strManufacturer) - 1)
            strNewSec2 = ""
            If InStr(strDriverVersions, ",") Then
                strx1 = Left(strDriverVersions, InStr(1, strDriverVersions, ",") - 1)
                strx2 = Right(strDriverVersions, InStr(1, strDriverVersions, ",") + 1)
                'compare strManufacturer and 64 86 in two variables for new sectionsearch
                strNewSec1 = strManufacturer & "." & strx1
                strNewSec2 = strManufacturer & "." & strx2
            Else
                If InStr(strDriverVersions, "86") Then
                'compare strManufacturer and 86 in a variable for new sectionsearch
                strNewSec1 = strManufacturer & "." & strDriverVersions
                End If
                If InStr(strDriverVersions, "64") Then
                'compare strManufacturer and 64 in a variable for new sectionsearch
                strNewSec1 = strManufacturer & "." & strDriverVersions
                End If
            End If
        End If
    Next vLine

    'READ DRIVERNAMES
    S = ReadIniSection(strIniFileName, strNewSec1)
    vLines = Split(S, Chr$(0))
    For Each vLine In vLines
       strlength = Len(vLine)
       Pos1 = InStr(vLine, "=")
       pos2 = replace(Left(vLine, Pos1 - 1), """", "")
       If InStr(strNewSec1, "64") Then
            ListBox1.AddItem pos2
        End If
        If InStr(strNewSec1, "86") Then
            ListBox2.AddItem pos2
        End If
    Next vLine

    If strNewSec2 <> "" Then
        S = ReadIniSection(strIniFileName, strNewSec2)
        vLines = Split(S, Chr$(0))
        For Each vLine In vLines
       strlength = Len(vLine)
       Pos1 = InStr(vLine, "=")
       pos2 = replace(Left(vLine, Pos1 - 1), """", "")
       If InStr(strNewSec2, "64") Then
            ListBox1.AddItem pos2
        End If
        If InStr(strNewSec2, "86") Then
            ListBox2.AddItem pos2
        End If
        Next vLine
    End If

    strDriverVer = ReadIniFileString("Version", "DriverVer", strIniFileName)
    TextBox2.Value = strGetFilenameFromPath
    TextBox3.Value = strManufacturer
    TextBox4.Value = strDriverVer
Else
    MsgBox "NOT A PRINTER INF FILE"
    Exit Sub
End If

End Sub

示例文件

我附上了三个 inf 文件的摘录。 所以我希望它可以更好地解释我想要什么。

示例 inf 文件 1:

[Manufacturer]
%LEXMARK%=LEXMARK PRINTERS,NTamd64,NTx86.6.0,NTamd64.6.0

[LEXMARK PRINTERS]
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTx86.5.1,USBPRINT\LexmarkLexmark_Unive1A7D
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTx86.5.1,,WSDPRINT\1284_CID_LexmarkPrinterColorA

[LEXMARK PRINTERS.NTamd64]
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTamd64.5.1,USBPRINT\LexmarkLexmark_Unive1A7D
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTamd64.5.1,,WSDPRINT\1284_CID_LexmarkPrinterColorA

[LEXMARK PRINTERS.NTx86.6.0]
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTx86.6.0,USBPRINT\LexmarkLexmark_Unive1A7D
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTx86.6.0,,WSDPRINT\1284_CID_LexmarkPrinterColorA

[LEXMARK PRINTERS.NTamd64.6.0]
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTamd64.6.0,USBPRINT\LexmarkLexmark_Unive1A7D
"Lexmark Universal v2 XL" = LMUD1P40.GPD.NTamd64.6.0,,WSDPRINT\1284_CID_LexmarkPrinterColorA

读取 inf 文件 1 后的结果:

TextBox1.Value =    "LEXMARK PRINTERS"
ListBox1 =          "Lexmark Universal v2 XL"
ListBox2 =          "Lexmark Universal v2 XL"

示例 inf 文件 2:

[MANUFACTURER]
%HP%=HP,NTAMD64

[HP.NTAMD64]
"HP Universal Printing PCL 5" = hpcu2306.gpd.NTAMD64,USBPRINT\Hewlett-PackardHP_LaAE38
"HP Universal Printing PCL 6" = hpcu2306.gpd.NTAMD64,USBPRINT\Hewlett-PackardHP_Co5005

读取inf文件2后的结果:

TextBox1.Value =    "HP"
ListBox1 =          "HP Universal Printing PCL 5"
                    "HP Universal Printing PCL 6"
ListBox2 =          ""

示例 inf 文件 3

[Manufacturer]
%Company% = DriverName,NTx86,NTamd64

[DriverName]
"Brother HL-L3210CW series" = BRSHL3210CW17A.DSI,USBPRINT\BROTHERHL-L3210CW_SEEDB1,BROTHERHL-L3210CW_SEEDB1
"Brother HL-L3230CDN series" = BRSHL3230CDN17A.DSI,USBPRINT\BROTHERHL-L3230CDN_S7497,BROTHERHL-L3230CDN_S7497
"Brother HL-L3230CDW series" = BRSHL3230CDW17A.DSI,USBPRINT\BROTHERHL-L3230CDW_SD3D7,BROTHERHL-L3230CDW_SD3D7

[DriverName.NTx86]
"Brother HL-L3210CW series" = BRSHL3210CW17A.DSI,USBPRINT\BROTHERHL-L3210CW_SEEDB1,BROTHERHL-L3210CW_SEEDB1
"Brother HL-L3230CDN series" = BRSHL3230CDN17A.DSI,USBPRINT\BROTHERHL-L3230CDN_S7497,BROTHERHL-L3230CDN_S7497
"Brother HL-L3230CDW series" = BRSHL3230CDW17A.DSI,USBPRINT\BROTHERHL-L3230CDW_SD3D7,BROTHERHL-L3230CDW_SD3D7

[DriverName.NTamd64]
"Brother HL-L3210CW series" = BRSHL3210CW17A.DSI,USBPRINT\BROTHERHL-L3210CW_SEEDB1,BROTHERHL-L3210CW_SEEDB1
"Brother HL-L3230CDN series" = BRSHL3230CDN17A.DSI,USBPRINT\BROTHERHL-L3230CDN_S7497,BROTHERHL-L3230CDN_S7497
"Brother HL-L3230CDW series" = BRSHL3230CDW17A.DSI,USBPRINT\BROTHERHL-L3230CDW_SD3D7,BROTHERHL-L3230CDW_SD3D7

读取/处理 inf 文件 2 后的结果:

TextBox1.Value =    "DriverName"
ListBox1 =          "Brother HL-L3210CW series"
                    "Brother HL-L3230CDN series"
                    "Brother HL-L3230CDW series"
ListBox2 =          "Brother HL-L3210CW series"
                    "Brother HL-L3230CDN series"
                    "Brother HL-L3230CDW series"

问题

如何正确提取 Line77 中的字符串以设置最多两个新变量来搜索下一部分?

谢谢问候杰拉德

  ask by drivenator78 translate from so

本文未有回复,本站智能推荐:

1回复

从.INI文件中获取值的Excel VBA代码是什么?

我有一个INI文件。 现在,我想在excel vba中解析该文件。 该代码必须在excel 2010或更高版本中工作。 我尝试在Google上获取针对此问题的代码,但没人能理解该代码的全部功能。 因此,请告诉我代码以解析INI文件,并概述一下代码中实际发生的事情。 谢谢
1回复

VBA:INI文件中的代码

我目前正在制作一个可以同时发送一堆带有附件的电子邮件的宏。 我是在Outlook中执行此操作的,但我想在Excel中重做它,因此任何用户都可以按电子表格上的按钮,然后通过电子邮件发送报告。 我的问题是某些报告中有一个特殊的主题(例如,截止到(从日期算起的6个月)的大麻到达),我只是将date
1回复

编写多个.ini文件的最佳方法

我有100多个不同的用户将使用某个程序,该程序需要在ini文件中进行不同的设置。 我认为excel可能是创建这些文件并将它们写入单个文件中的文件夹的最佳方式。 数据应如下所示。 所有这些数据都需要包含在每个文本文件中: 以下每列的各个值都将包含所需的数据。 所以Cell B1
1回复

从列表框获取项目并将其放入列中

我想从多选列表框中获取选定的项目,然后将这些项目放在下面的列中。 我已经找到了如何获得所选项目的方法,但还没有找到将它们放入工作表的方法。 继承人代码:
2回复

从Web列表框中获取元素列表

我试图计算网页上列表框中的所有元素(最终通过它们进行循环,但是解决此问题将有助于循环): 我对VBA还是很陌生,但是我确实相信这是一个列表框对象,因为在Firebug中,此对象的名称末尾带有“列表框”。 我在这里或其他地方找到的所有建议都与.ListCount或.ListIndex
1回复

创建列表框

我正在尝试使用 VBA 从 Access 创建 Excel 报告。 因此,每次用户单击 Access 表单中的按钮时,都应该生成一个 Excel 文件。 我需要在文件中有 ListBox。 我正在声明 ListBox 添加项目,但在将其分配给特定单元格时遇到问题: 现在我想在 Cells(7,
2回复

列表框ListFillRange

我在工作表上插入了一个表单控件列表框。 由于某种原因,这会出错。 我想用范围填充列表框,但出现运行时错误“ 438”,对象不支持此属性或方法。 我在这里想念什么?
1回复

如何从列表框中获取输出以填充某些单元格

我创建了一个带有几个列表框的用户窗体。Listbox1中包含所有项目,用户可以选择多个值,然后移到Listbox2中。 一旦它们进入listbox2,我就需要它们来填充一些单元格。 每个单元格有1个列表项。 我很想尝试如何做。 到目前为止,我所拥有的只是: 这将使用整个列表项