想从一个没有扩展名的文件里把一些文字列取出放到一个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本人菜鸟,劳烦大侠帮帮忙,真心感谢~!!
没有扩展名的文件:
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本人菜鸟,劳烦大侠帮帮忙,真心感谢~!!
INSERT into A_TABLE
INSERT into B_TABLE
请忽略掉。
源数据文件指的是没有扩展名的那个文件吗?
我把文件上傳到資源里了:http://download.csdn.net/detail/lovebelobe/4212680
请看一下~!
你搜索的资源不存在,请返回下载频道首页发我邮件吧
[email protected]
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
那代码就很好写了。
我觉得你把逻辑搞得太复杂。先说我对你所写的 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
既然你要用 Line Input 来创建列名,这应该是‘动态格式’的处理方式,你你后面又有
If strDataColumnName = "ID" Or strDataColumnName = "Code" Or strDataColumnName = "Number" Then
这样又是确定的列名内容,何苦搞得那么复杂呢。
几行代码直接把表头写到指定位置不就行了?
多謝大俠的指點!短短代碼,雖然上網查閱資料,但其中還是有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
Sub test()
a = "ID = A1"
b = Split(a, " = ")(1)
Debug.Print b
End Sub
打印出來的結果是A1
不带$,则返回值为 Variant类型(比如Left() )对于 Variant类型的数据,它在实际使用时,会根据操作需要进行自动类型转换,再进行相应操作。
所以,这就有‘运行效率’的差别了。我的代码中,几乎不会用到 Variant类型的数据(或变量)。
当然,某些只适用于Variant类型的另当别论。
这只是编程思想和习惯的问题,也并非必须如此。至于第①个,你可以根据需要,适当增加‘码长’就行了。
比如你说的那4个,长度取3就解决问题了。
码表为:COLIDSTR = "ID CodNumIDC" (注:第一个ID后面加个空格)
判断列:lCol = InStr(1, COLIDSTR, Left$(strData, 3))用这种方式实在不好解决的,就用一个字符串数组表,先把列名提取到一个字符串变量中,然后用这个变量在数组表中‘查表’得到是“第几个列”,然后再作相应处理。这样也是效率比较高的做法。
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
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
http://topic.csdn.net/u/20110720/12/119ee538-e3b0-4b28-9ec7-22b61aa99486.html
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 的值(列名称的序号)来确定写入哪列,不好么?
并且,这种方式,并不要求数据按顺序来记录;也不要求‘每一组数据要完整’。
象你那种,用变量递增来写列数据,中间要是缺一项记录,你写入的数据就‘错位’了。
VB代码中,在一行上写多条语句,就用它来分隔。下面这行代码:
If (strData = ";") Then j = j + 1: Exit Do
换种写法,就是:
If (strData = ";") Then
j = j + 1
Exit Do
End if
要看你的具体应用环境。比如:
直接写在代码中(在某个过程中嵌入代码,或专门写一个过程来完成)
从一个初始化文件中读取(Excel工作簿、文本文件、数据库等)
从‘数据源’加载(比如你主贴中提到那个文件,已经包含所有列名)等等……
这要你自己去选择如何做。