使用excel,将第二列中的前四个字符连接到第一列中数据的前四个字符(如果存在)

时间:2014-04-09 03:35:54

标签: excel vba excel-vba

我打算在Microsoft SQL数据库中维护USB设备的VID和PID列表。该列表可以从以下网站获得:http://www.linux-usb.org/usb.ids

网站来源的示例格式:

0001  Fry's Electronics
    142b  Arbiter Systems, Inc.
    7778  Counterfeit flash drive [Kingston]
0002  Ingram
0003  Club Mac
0004  Nebraska Furniture Mart
0011  Unknown manufacturer
    7788  Flash mass storage drive
0053  Planex
    5301  GW-US54ZGL 802.11bg
0079  DragonRise Inc.
    0006  PC TWIN SHOCK Gamepad
    0011  Gamepad
0105  Trust International B.V.
    145f  NW-3100 802.11b/g 54Mbps Wireless Network Adapter [zd1211]
0145  Unknown
    0112  Card Reader
017c  MLK
    145f  Trust Deskset
0200  TP-Link
    0201  MA180 UMTS Modem
0204  Chipsbank Microelectronics Co., Ltd
    6025  CBM2080 / CBM2090 Flash drive controller
    6026  CBM1180 Flash drive controller
...

在SQL数据库表中找到的值的格式示例:

0001142b  Fry's Electronics Arbiter Systems, Inc.
00017778  Fry's Electronics Counterfeit flash drive [Kingston]
0002  Ingram
0003  Club Mac
0004  Nebraska Furniture Mart
00117788  Unknown manufacturer Flash mass storage drive       
00535301  Planex GW-US54ZGL 802.11bg
...

所以我想把它加载到DB中的方法是使用excel VBA / Macro进行处理,我将第二列中的前四个字符(PID)连接到前四个字符(VID) )在第一栏。

我可以从Excel专家和专家那里获得帮助,我怎样才能以最简单的方式实现这一点,使用VBA或宏?

非常感谢任何帮助和建议!谢谢!

2 个答案:

答案 0 :(得分:1)

实际上这很简单。我所做的是复制上面链接中的数据并将其粘贴到记事本中,如下所示。我只是为了演示目的而采用了27条奇数行。

enter image description here

<强>逻辑:

  1. 一次读取数组中的整个文件(Say MyData)!
  2. 创建一个新数组来存储输出
  3. 循环MyData并检查第一个字符是否为空。 (实际上是Horz Tab)。因此,我们无法使用Len(Trim())
  4. 如果不是那么它就成了我们的PREFIX
  5. 如果是,那么我们再次遍历数组并检查,直到我们在哪里有Horz Tab作为第一个字符的记录,这就变成了SUFFIX。只需加入它们并将它们存储在输出数组中,Say MyFinalData
  6. <强>代码:

    Option Explicit
    
    Sub Sample()
        Dim MyData As String, strData() As String
        Dim MyFinalData() As String, sPrefix As String
        Dim i As Long, j As Long, n As Long
    
        '~~> Open text file and read into the array in one go
        Open "C:\sample.Txt" For Binary As #1
        MyData = Space$(LOF(1))
        Get #1, , MyData
    
        '~~> Close Text File
        Close #1
    
        strData() = Split(MyData, vbCrLf)
    
        ReDim Preserve MyFinalData(UBound(strData) + 1)
    
        For i = 0 To UBound(strData)
            If Asc(Left(strData(i), 1)) <> 9 Then _
            sPrefix = Split(strData(i), " ")(0)
    
            If Not i = UBound(strData) Then
                If Asc(Left(strData(i + 1), 1)) = 9 Then
                    For j = i + 1 To UBound(strData)
                        If Asc(Left(strData(j), 1)) <> 9 Then
                            i = j - 1
                            Exit For
                        End If
                        MyFinalData(n) = sPrefix & _
                                         Trim(Replace(strData(j), vbTab, ""))
                        n = n + 1
                    Next j
                Else
                    MyFinalData(n) = strData(i)
                    n = n + 1
                End If
            End If
    
            sPrefix = ""
        Next i
    
        '~~> Showing output here. You can directly write this data to an 
        '~~> excel sheet if you want.
        For i = LBound(MyFinalData) To UBound(MyFinalData)
            Debug.Print MyFinalData(i)
        Next i
    End Sub
    

    <强>输出:

    enter image description here

答案 1 :(得分:0)

如果您不介意临时搭建,可以尝试以下方法:

  1. 将输出复制并粘贴到excel文件中,从单元格A2开始(不是A1) Evertything将粘贴在第1列
  2. 中 在cel B2中
  3. 输入:= IF(LEFT(A2; 4)=“”; B1; LEFT(A2; 4))
  4. 在cel C2中
  5. 输入:= IF(LEFT(A2; 4)=“”; MID(A2; 5; 4);“父亲”)
  6. 在cel D2中
  7. 输入:= IF(LEFT(A2; 4)=“”; D1; MID(A2; 6; LEN(A2)-6))
  8. in cel E2输入:= IF(LEFT(A2; 4)=“”; MID(A2; 10; LEN(A2)-10);“”)
  9. 最后在cel F2中输入最终公式:= IF(AND(B2 = B3; C2 =“父亲”);“”; IF(AND(B2&lt;&gt; B3; C2 =“父亲”); B2&amp; ;“”&amp; D2; B2&amp; C2&amp;“”&amp; D2&amp;“”&amp; E2))
  10. 现在,如果你全部选择它们并将单元格向下拖动到列表的末尾,在列F中你将得到清洁代码的列表:没有'儿子'和儿子的父亲:复制,粘贴特殊于别的地方并排序以删除空单元格。

    无法发布图片以显示结果:至少需要10点声望(!!!!)

    侨!