14. november 2001 - 15:41Der er
9 kommentarer og 1 løsning
Indlæsning af data i listview fra txt-file (vba)
Jeg har i vba et listview, hvor jeg skal indlæse data fra en txt file. Foruden mit listitem har jeg også 3 subitems det skal indlæses. Indtil nu bruger jeg koden
Private Sub CommandButton1_Click() Rownr = 0 Open \"C:\\vbalist\\slu.txt\" For Input As #1 Do While EOF(1) = False Rownr = Rownr + 1 Line Input #1, MyMatrix(Rownr) Loop Close #1
For i = 1 To Rownr With ListView1.ListItems.Add(, , MyMatrix(i)) End With Next i End Sub
Jeg ønsker, at lave en komma separerede txt fil, hvor så mine subitems indlæses i listviewet…. Men jeg er strandet her….
Noget som
Private Sub CommandButton1_Click() Rownr = 0 Listnr = 0 Open \"C:\\vbalist\\slu.txt\" For Input As #1 Do While EOF(1) = False Rownr = Rownr + 1 Line Input #1, MyMatrix(Listnr, Rownr) Loop Close #1
For i = 1 To Rownr With ListView1.ListItems.Add(, , MyMatrix(i)) End With Next i End Sub
Private Sub CommandButton1_Click() dim sBuf() as string Rownr = 0 Listnr = 0
Open \"C:\\vbalist\\slu.txt\" For Input As #1 Do While EOF(1) = False Rownr = Rownr + 1 Line Input #1, MyMatrix(Listnr, Rownr) Loop Close #1
For i = 1 To Rownr sbuf = split(mymatrix(i, \",\") With ListView1.ListItems.Add(, , sbuf(0)) .subItems(1) = sbuf(1) .subItems(2) = sbuf(2) .subItems(3) = sbuf(3) End With Next i End Sub
Her er et par implementationer, du kan bruge. Indsæt dem i et modul. Join er modparten til Split.
\' Define the mighty Join function for VB5 Function Join(vaSourceArray As Variant, _ Optional vsDelimiter As Variant) As String Dim i As Long If IsMissing(vsDelimiter) Then vsDelimiter = \" \" For i = LBound(vaSourceArray) To UBound(vaSourceArray) - 1 Join = Join & vaSourceArray(i) & vsDelimiter Next Join = Join & vaSourceArray(i) End Function
\' VB5 users get a better Split than Split (except Compare parameter ignored) Function Split(sExpression As String, _ Optional Delimiters As Variant, _ Optional Limit As Variant, _ Optional Compare As VbCompareMethod) As Variant Dim sToken As String, avsRet() As Variant, c As Long Dim sDelimiters As String If IsMissing(Delimiters) Then Delimiters = sWhiteSpace sDelimiters = Delimiters If IsMissing(Limit) Then Limit = -1 \' Ignore the user\'s pitiful request for case-sensitivity \' (actually left as an exercise for the reader) Compare = vbBinaryCompare \' Error trap to resize on overflow On Error GoTo SplitResize \' Break into tokens and put in an array sToken = GetToken(sExpression, sDelimiters) Do While sToken <> sEmpty If Limit <> -1 Then If c >= Limit Then Exit Do avsRet(c) = sToken c = c + 1 sToken = GetToken(sEmpty, sDelimiters) Loop \' Size is an estimate, so resize to counted number of tokens If c Then ReDim Preserve avsRet(0 To c - 1) As Variant Split = avsRet Exit Function
SplitResize: \' Resize on overflow Const cChunk As Long = 20 If Err.Number = eeOutOfBounds Then ReDim Preserve avsRet(0 To c + cChunk) As Variant Resume \' Try again End If ErrRaise Err.Number \' Other VB error for client End Function
Den her har jeg kunnet compile i en Access 2000 database (godt nok i Access 2002)
Option Compare Database
Private Declare Function StrSpn Lib \"SHLWAPI\" Alias \"StrSpnW\" (ByVal psz As Long, ByVal pszSet As Long) As Long Private Declare Function StrCSpn Lib \"SHLWAPI\" Alias \"StrCSpnW\" (ByVal lpStr As Long, ByVal lpSet As Long) As Long
Private Declare Sub CopyMemory Lib \"kernel32\" Alias \"RtlMoveMemory\" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const sEmpty = \"\"
Function GetToken(sTarget As String, sSeps As String) As String
\' If SHLWAPI.DLL not available, delegate to Basic-only GetToken \' If fNoShlWapi Then \' GetToken = GetTokenO(sTarget, sSeps) \' Exit Function \' End If
\' Note that sSave, pSave, pCur, and cSave must be static between calls Static sSave As String, pSave As Long, pCur As Long, cSave As Long \' First time through save start and length of string If sTarget <> sEmpty Then \' Save in case sTarget is moveable string (Command$) sSave = sTarget pSave = StrPtr(sSave) pCur = pSave cSave = Len(sSave) Else \' Quit if past end (also catches null or empty target) If pCur >= pSave + (cSave * 2) Then Exit Function End If
\' Find start of next token Dim pNew As Long, c As Long, pSeps As Long pSeps = StrPtr(sSeps) c = StrSpn(pCur, pSeps) \' Set position to start of token If c Then pCur = pCur + (c * 2)
\' Find end of token c = StrCSpn(pCur, pSeps) \' If token length is zero, we\'re at end If c = 0 Then Exit Function
\' Cut token out of target string GetToken = String$(c, 0) CopyMemory ByVal StrPtr(GetToken), ByVal pCur, c * 2 \' Set new starting position pCur = pCur + (c * 2)
End Function
Function Split(sExpression As String, _ Optional Delimiters As Variant, _ Optional Limit As Variant, _ Optional Compare As VbCompareMethod) As Variant Dim sToken As String, avsRet() As Variant, c As Long Dim sDelimiters As String If IsMissing(Delimiters) Then Delimiters = sWhiteSpace sDelimiters = Delimiters If IsMissing(Limit) Then Limit = -1 \' Ignore the user\'s pitiful request for case-sensitivity \' (actually left as an exercise for the reader) Compare = vbBinaryCompare \' Error trap to resize on overflow On Error GoTo SplitResize \' Break into tokens and put in an array sToken = GetToken(sExpression, sDelimiters) Do While sToken <> sEmpty If Limit <> -1 Then If c >= Limit Then Exit Do avsRet(c) = sToken c = c + 1 sToken = GetToken(sEmpty, sDelimiters) Loop \' Size is an estimate, so resize to counted number of tokens If c Then ReDim Preserve avsRet(0 To c - 1) As Variant Split = avsRet Exit Function
SplitResize: \' Resize on overflow Const cChunk As Long = 20 If Err.Number = eeOutOfBounds Then ReDim Preserve avsRet(0 To c + cChunk) As Variant Resume \' Try again End If Err.Raise Err.Number End Function
Ja okay jeg arbejder i Excel97 (stadig ingen held) Det er dog en mulighed, at indlæse data fra txt-filen ind i excel og så derefter ind i listview. (med en tab-separerede liste) jeg er nok nødt til, at skaffe mig en rigtig vb6 på dene computer, alt ander er lidt for omstændigt!! eller hvad??????
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.