想从一个没有扩展名的文件里把一些文字列取出放到一个Excel文件夹里作为列。
没有扩展名的文件:
INSERT into A_TABLE
ID = “A1” ‘有的前面有双引号
Code = “A01”
Number = 001 ‘有的前面没有双引号
;
INSERT into B_TABLE
ID = “B1”
Code = “B01”
Number = 002
;Excel文件:
ID Code Number
A1 A01 001
B1 B01 002本人菜鸟,劳烦大侠帮帮忙,真心感谢~!!

解决方案 »

  1.   

    文件有没有扩展名,对VB来说是没区别的。INSERT into A_TABLEINSERT into B_TABLE这样的数据,忽略掉?按字面意思看,读取到这样的数据后,应该写另一个表中了,但楼主的‘结果’是紧接着前面的数据写的。还有,也是关键的地方,不太清楚楼主的源数据文件究竟是什么样的格式。
      

  2.   

    谢谢你的回复。
    INSERT into A_TABLE
    INSERT into B_TABLE
    请忽略掉。
    源数据文件指的是没有扩展名的那个文件吗?
    我把文件上傳到資源里了:http://download.csdn.net/detail/lovebelobe/4212680
    请看一下~!
      

  3.   


    你搜索的资源不存在,请返回下载频道首页发我邮件吧
    [email protected]
      

  4.   

    我寫的非常幼稚的代碼:Sub MoveData()  '移動數據
        Dim strFileName As String
        Dim intFileNo As Integer            'DB Data File Number
        Dim strData As String
        Dim strDataColumnName As String     '列名
        Dim strDataCut As String            '數據
        Dim spaceLocCloumn As Integer       '列名中出現空格的位置
        Dim spaceLocData As Integer         '數據中出現空格的位置
        
        Call CreateColumName    '調用創建列名的方法,先創建列名然後再填入數據
        
        intFileNo = FreeFile
        i = 2   '填入數據初始列
        j = 3   '填入數據初始行
        strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
        Open strFileName For Input As #intFileNo
            Do While Not EOF(intFileNo)
                Line Input #intFileNo, strData
                If strData = ";" Or strData Like "INSERT into*" Then    '如果是不需要的列,則
                    If strData = ";" Then
                    '以“;”為分隔符,如果是一條數據的最後一行,則換行。Split方法我不會用,怎麼用?>_<
                        j = j + 1
                        i = 2
                    Else
                    End If
                Else
                    spaceLocCloumn = InStr(strData, " ") - 1            '尋找列名中有空格的位置
                    spaceLocData = Len(strData) - spaceLocCloumn - 3    '尋找數據中有空格的位置
                    If spaceLoc = -1 Then
                    '如果沒有空格就不管它。可以不管?這裡如何寫比較好?                Else
                        strDataColumnName = Left(strData, spaceLocCloumn)               '獲取列名
                        strDataCut = Replace(Right(strData, spaceLocData), """", "")    '獲取數據
                    End If
                    If strDataColumnName = "INSERT" Then    '如果是不需要的行,則填入數據的列數-1
                        i = i - 1
                    Else
                        If strDataColumnName = "ID" Or strDataColumnName = "Code" Or strDataColumnName = "Number" Then
                        '選擇需要的列的數據(實際情況中有的列的數據是不需要的),這個方法超笨的,有沒有其他方法呀?
                            Worksheets("Sheet1").Activate
                            Worksheets("Sheet1").Cells(j, i).Value = strDataCut
                            '把數據填入表格中
                        Else
                            i = i - 1   '如果是不需要的列,則填入列數-1
                        End If
                    End If
                    i = i + 1   '如果是需要的列,則填入列數+1
                End If
            Loop
        Close intFileNo
    End Sub
    Sub CreateColumName()   '移動列名
        Dim strFileName As String
        Dim intFileNo As Integer    'DB Data File Number
        Dim strData As String
        Dim strDataColumnName As String     '列名
        Dim strDataCut As String            '數據
        Dim spaceLocCloumn As Integer       '列名中出現空格的位置
        Dim spaceLocData As Integer         '數據中出現空格的位置    intFileNo = FreeFile
        i = 2
        strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
        Open strFileName For Input As #intFileNo
            Do While Not EOF(intFileNo)
                Line Input #intFileNo, strData
                If strData = ";" Then   '如果是最後,則不再重複創建列名
                    Exit Sub
                Else
                    spaceLocCloumn = InStr(strData, " ") - 1            '尋找列名中有空格的位置
                    spaceLocData = Len(strData) - spaceLocCloumn - 3    '尋找數據中有空格的位置
                    If spaceLoc = -1 Then
                    '如果沒有空格就不管它。可以不管?這裡如何寫比較好?                Else
                        strDataColumnName = Left(strData, spaceLocCloumn)               '尋找列名中有空格的位置
                        strDataCut = Replace(Right(strData, spaceLocData), """", "")    '尋找數據中有空格的位置
                    End If
                    If strDataColumnName = "INSERT" Then    '如果是不需要的行,則填入數據的列數-1
                        i = i - 1
                    Else
                        If strDataColumnName = "ID" Or strDataColumnName = "Code" Or strDataColumnName = "Number" Then
                        '選擇需要的列的數據(實際情況中有的列的數據是不需要的),這個方法超笨的,有沒有其他方法呀?
                        Worksheets("Sheet1").Activate
                        Worksheets("Sheet1").Cells(2, i).Value = strDataColumnName  '填入列名
                        Else
                        i = i - 1    '如果是不需要的列,則填入列數-1
                        End If
                    End If
                    i = i + 1   '如果是需要的列,則填入列數+1
                End If
            Loop
        Close intFileNo
    End Sub
      

  5.   

    从你在 8F 的代码来看,是在VBA中应用?
    那代码就很好写了。
    我觉得你把逻辑搞得太复杂。先说我对你所写的 MoveData() 的看法吧:Sub MoveData()  '移動數據
       Dim strFileName As String
       Dim intFileNo  As Integer           'DB Data File Number
       Dim strData    As String
       Dim objSht     As Worksheet         ' *** 声明一个变量来引用要操作的工作表
       Dim lCol       As Long              ' *** 操作的列号
       Const COLIDSTR As String = "IDCoNu" ' *** 判断写入列   Call CreateColumName    '調用創建列名的方法,先創建列名然後再填入數據
       intFileNo = FreeFile
       i = 2   '填入數據初始列
       j = 3   '填入數據初始行
       strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
       Open strFileName For Input As #intFileNo
       Set objSht = Worksheets("Sheet1")
       Do While Not EOF(intFileNo)
          Line Input #intFileNo, strData
          ' 针对你的固定格式的文本的处理代码
          Do
             If (strData = ";") Then j = j + 1: Exit Do   ' 指向下一行
             lCol = InStr(1, COLIDSTR, Left$(strData, 2))
             If (lCol = 0) Then Exit Do                   ' 不是需要的数据
             strData = Replace(strData, """", "")         ' 去掉引号
             objSht.Cells(j, i + lCol \ 2).Value2 = Split(strData, " = ")(1)    ' 写入
             Exit Do  ' 这个不能少!!!
          Loop
       Loop
       Set objSht = Nothing
       Close intFileNo
    End Sub
      

  6.   

    再说下你的 CreateColumName()我真没明白你如何要那样写。
    既然你要用 Line Input 来创建列名,这应该是‘动态格式’的处理方式,你你后面又有
    If strDataColumnName = "ID" Or strDataColumnName = "Code" Or strDataColumnName = "Number" Then
    这样又是确定的列名内容,何苦搞得那么复杂呢。
    几行代码直接把表头写到指定位置不就行了?
      

  7.   

    對的,是在VBA中應用。
    多謝大俠的指點!短短代碼,雖然上網查閱資料,但其中還是有3個不知道的地方(以下代碼中用>_<標出的部份),請不吝賜教。
    Sub MoveData()
       Dim strFileName As String
       Dim intFileNo  As Integer
       Dim strData    As String
       Dim objSht     As Worksheet         ' *** 声明一个變量来引用要操作的工作表
       Dim lCol       As Long              ' *** 操作的列号
       Const COLIDSTR As String = "IDCoNu" ' *** 判断写入列
       '>_< ①因為實際情況中列名有很多,若出現列名為ID,Code,Number,IDCode這種列該怎麼處理?ID只有兩位,但IDCode前2位和ID是一樣的。   'Call CreateColumName
       intFileNo = FreeFile
       i = 2   '填入數據初始列
       j = 3   '填入數據初始行
       strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
       Open strFileName For Input As #intFileNo
       Set objSht = Worksheets("Sheet1")
       Do While Not EOF(intFileNo)
          Line Input #intFileNo, strData
          '針對You的固定格式的文本的處理代碼
          Do
             If (strData = ";") Then j = j + 1: Exit Do   ' 指向下一行
             lCol = InStr(1, COLIDSTR, Left$(strData, 2)) '>_<  ②"$"這個符號有何作用?
             If (lCol = 0) Then Exit Do                   ' 不是需要的数据
             strData = Replace(strData, """", "")         ' 去掉引号
             objSht.Cells(j, i + lCol \ 2).Value2 = Split(strData, " = ")(1)
             '>_< ③写入   (1)是何意思?此時strData是ID = A1的形式,如何只把A1填入表中的?
             Exit Do  ' 這个不能少!!!
          Loop
       Loop
       Set objSht = Nothing
       Close intFileNo
    End Sub
      

  8.   

    第三個問題我知道了,因為Split函數生成的是數組,所以這樣寫的意思就是數組(0)=ID,數組(1)=A1。
    Sub test()
        a = "ID = A1"
        b = Split(a, " = ")(1)
        Debug.Print b
    End Sub
    打印出來的結果是A1
      

  9.   

    VB或VBA中有很多字符串操作函数都有带$和不带$的两个版本。带$的,返回值是 String类型(比如 Left$() )
    不带$,则返回值为 Variant类型(比如Left() )对于 Variant类型的数据,它在实际使用时,会根据操作需要进行自动类型转换,再进行相应操作。
    所以,这就有‘运行效率’的差别了。我的代码中,几乎不会用到 Variant类型的数据(或变量)。
    当然,某些只适用于Variant类型的另当别论。
    这只是编程思想和习惯的问题,也并非必须如此。至于第①个,你可以根据需要,适当增加‘码长’就行了。
    比如你说的那4个,长度取3就解决问题了。
    码表为:COLIDSTR = "ID CodNumIDC"  (注:第一个ID后面加个空格)
    判断列:lCol = InStr(1, COLIDSTR, Left$(strData, 3))用这种方式实在不好解决的,就用一个字符串数组表,先把列名提取到一个字符串变量中,然后用这个变量在数组表中‘查表’得到是“第几个列”,然后再作相应处理。这样也是效率比较高的做法。
      

  10.   

    謝謝大俠的耐心指導,我又寫了一段幼稚的代碼,0_0標注的是問題。Sub MoveData()
       Dim strFileName As String
       Dim intFileNo  As Integer
       Dim strData    As String
       Dim objSht     As Worksheet
       Dim Column(3) As String
       Column(0) = "ID"                  '0_0 一個個聲明的話,有一百多列,動態數組怎麼用?
       Column(1) = "Code"
       Column(2) = "Number"
       Column(3) = "IDCode"
       Dim ColumnName As String   intFileNo = FreeFile
       i = 1   '填入數據初始列
       j = 3   '填入數據初始行
       k = 0   '數組列號
       strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
       Open strFileName For Input As #intFileNo
       Set objSht = Worksheets("Sheet1")
       Do While Not EOF(intFileNo)
          Line Input #intFileNo, strData
          
          Do
             If (strData = ";") Then j = j + 1: k = 0: i = 1: Exit Do
             If (strData Like "INSERT into*") Then k = 0: i = 1: Exit Do '0_0 這個“:”是什麼東西?
             strData = Replace(strData, """", "")
             ColumnName = Split(strData, " = ")(0)
             If (ColumnName <> Column(k)) Then Exit Do                   ' 不是需要的数据
             k = k + 1
             objSht.Cells(j, i + 1).Value2 = Split(strData, " = ")(1)
             i = i + 1
             Exit Do
          Loop
       Loop
       Set objSht = Nothing
       Close intFileNo
    End Sub
      

  11.   

    謝謝大俠的耐心指導,我又寫了一段幼稚的代碼,0_0標注的是問題。
    Sub MoveData()
       Dim strFileName As String
       Dim intFileNo  As Integer
       Dim strData    As String
       Dim objSht     As Worksheet
       Dim Column(3) As String
       Column(0) = "ID"                  '0_0 一個個聲明的話,有一百多列,動態數組怎麼用?
       Column(1) = "Code"
       Column(2) = "Number"
       Column(3) = "IDCode"
       Dim ColumnName As String   intFileNo = FreeFile
       i = 1   '填入數據初始列
       j = 3   '填入數據初始行
       k = 0   '數組列號
       strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
       Open strFileName For Input As #intFileNo
       Set objSht = Worksheets("Sheet1")
       Do While Not EOF(intFileNo)
          Line Input #intFileNo, strData
          
          Do
             If (strData = ";") Then j = j + 1: k = 0: i = 1: Exit Do
             If (strData Like "INSERT into*") Then k = 0: i = 1: Exit Do '0_0 這個“:”是什麼東西?
             strData = Replace(strData, """", "")
             ColumnName = Split(strData, " = ")(0)
             If (ColumnName <> Column(k)) Then Exit Do                   ' 不是需要的数据
             k = k + 1
             objSht.Cells(j, i + 1).Value2 = Split(strData, " = ")(1)
             i = i + 1
             Exit Do
          Loop
       Loop
       Set objSht = Nothing
       Close intFileNo
    End Sub
      

  12.   

    楼主可以参考这篇文章:
    http://topic.csdn.net/u/20110720/12/119ee538-e3b0-4b28-9ec7-22b61aa99486.html
      

  13.   

    楼主参考一下这个代码:
    Sub MoveData()
       Dim strFileName As String
       Dim intFileNo  As Integer
       Dim strData    As String
       Dim objSht     As Worksheet
       Dim Column(3)  As String
       Dim ColumnName As String
       Dim lColumnTop As Long           ' 用一个变量来记录列名表数组上界值   Column(0) = "ID"
       Column(1) = "Code"
       Column(2) = "Number"
       Column(3) = "IDCode"
       intFileNo = FreeFile
       i = 1   '填入數據初始列
       j = 3   '填入數據初始行
       'k = 0   '數組列號      ' 这句有必要吗?
       lColumnTop = 3
       strFileName = "C:\Documents and Settings\Administrator\デスクトップ\TEST"
       Open strFileName For Input As #intFileNo
       Set objSht = Worksheets("Sheet1")
       Do While Not EOF(intFileNo)
          Line Input #intFileNo, strData
          
          Do
             'If (strData = ";") Then j = j + 1: k = 0: i = 1: Exit Do
             If (strData = ";") Then j = j + 1:  Exit Do
             If (strData Like "INSERT into*") Then k = 0: i = 1: Exit Do
             strData = Replace(strData, """", "")
             ColumnName = Split(strData, " = ")(0)
             ' 用下面的循环来找‘列名’的 序号
             For k = 0 To lColumTop
                If (ColumnName = Column(k)) Then Exit For
             Next
             If (k > lColumnTop) Then Exit Do       ' 不是需要的数据
             objSht.Cells(j, i + k).Value = Split(strData, " = ")(1)
             Exit Do
          Loop
       Loop
       Set objSht = Nothing
       Close intFileNo
    End Sub我真不明白你为什么要用 i=i+1 来决定写入哪列
    你这样只能适用于需要的数据按‘既定顺序’在文件中记录的情况
    虽然多数情况下,这个数据记录顺序是‘既定顺序’,但你这样没一点灵活性直接按 k 的值(列名称的序号)来确定写入哪列,不好么?
    并且,这种方式,并不要求数据按顺序来记录;也不要求‘每一组数据要完整’。
    象你那种,用变量递增来写列数据,中间要是缺一项记录,你写入的数据就‘错位’了。
      

  14.   

    我在 9F 回复代码中的冒号是“语句分隔”符。
    VB代码中,在一行上写多条语句,就用它来分隔。下面这行代码:
    If (strData = ";") Then j = j + 1:  Exit Do
    换种写法,就是:
    If (strData = ";") Then
       j = j + 1
       Exit Do
    End if
      

  15.   

    忘记了说那个‘表’的初始化问题。‘方法’是多样的,但‘好方法’只有那么一两个。
    要看你的具体应用环境。比如:
    直接写在代码中(在某个过程中嵌入代码,或专门写一个过程来完成)
    从一个初始化文件中读取(Excel工作簿、文本文件、数据库等)
    从‘数据源’加载(比如你主贴中提到那个文件,已经包含所有列名)等等……
    这要你自己去选择如何做。