03. oktober 2003 - 11:05Der er
45 kommentarer og 2 løsninger
Application.WorksheetFunction.Transpose
Hej
Jeg skal have Transponeret et array - min kode ser ud som følgende:
Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim intColIndex As Integer Dim DBPath, DBBase, i, j, tmpList As Variant, tmpRSList As Variant Dim Count1, count2 DBPath = GetName("strPathDB") DBBase = GetName("strMainDB")
' open the database Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ DBPath & DBBase & ";" Set rs = New ADODB.Recordset With rs ' open the recordset .Open DBTable, cn, adOpenStatic, adLockOptimistic, adCmdTable tmpRSList = rs.GetRows
ReDim tmpList(0 To rs.Fields.Count - 1, 0 To rs.RecordCount - 1)
End With rs.Close Set rs = Nothing cn.Close Set cn = Nothing
Men den kommer og siger:
Type mismatch på linien tmpList = Application.WorksheetFunction.Transpose(tmpList)
Jeg tror at jeg har fundet fejlen som formenlig består i at posterne i tmpList er i string format og de skal være varianter - men hvordan ændre jeg dette???
jeg synes at du tager et par omveje, hvorfor gør du det ? Prøv at skimme nedenstående som jeg bruger til at hente data til en list.
Public Liste() Public Sub GetTable()
Dim rsData As ADODB.Recordset Dim szConnect As String Dim szSQL As String Dim Database As String Dim Tabel As String Database = "o:\logistik\database\logistik.mdb" Tabel = "leverandørkart"
'SQL Statement. szSQL = "SELECT Navn, Konto " & _ "FROM " & Tabel & _ " WHERE Aktiv = True " & _ "ORDER BY Navn"
'Create the Recorset object and run the query. Set rsData = New ADODB.Recordset rsData.Open szSQL, szConnect, adOpenForwardOnly, _ adLockReadOnly, adCmdText
Liste = Application.WorksheetFunction.Transpose(rsData.GetRows) End Sub
Public Function GetCust(DBTable As String) '**************************************************************************************** '* Function created on 1. October 2003 by Morten Frederiksen * '* Function changed on '* '**************************************************************************************** '* Værdier der skal bruges til at hente oplysning fra settings arket * '****************************************************************************************
Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim intColIndex As Integer Dim DBPath, DBBase, i, j, k, tmpList As Variant, tmpRSList As Variant Dim Count1, count2, posten As Variant DBPath = GetName("strPathDB") DBBase = GetName("strMainDB")
' open the database Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ DBPath & DBBase & ";" Set rs = New ADODB.Recordset With rs ' open the recordset .Open DBTable, cn, adOpenStatic, adLockOptimistic, adCmdTable
Nu har jeg prøvet at skrive din kode af men nu kommer den med en fejl om at enten EOF eller BOF er nået....... jeg kan se at rsDAta indeholder posterne...
Du får lige koden Public Function GetCust2(DBTable As String) As Variant
Dim rsData As ADODB.Recordset Dim szConnect As String Dim szSQL As String Dim Database As String
'Create the Recordset object and run the query Set rsData = New ADODB.Recordset rsData.Open szSQL, szConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
jeg tror jeg ved hvorfor den fejler. rs felterne starter ved 0, dvs rs(0) er første felt. Transpose kan ikke klare at starte ved 0. Det er lidt ligesom Option base 1. hvis du istedet definerer i szSql hvilke felter du vil have overført går det fint.
Nej det tror jeg altså ikke - det er fordi nogle af posterne indeholder værdien Null (eller det er jo ikke en værdi nærmere ingenting) - når jeg går i databasen og indsætter et X i de tomme felter så virker skidtet...
Og jeg ville også være ked af at skulle indsætte felter for så kan jeg ikke bruge funktionen til andre tabeller - det var jo tanken at den skulle kunne bruges til mange andre funktioner også... ;O)
Men ved du om der er en løsning på Null problemet - jeg kan selvfølelig definere at tabellen ikke må indeholde Null - men det synes jeg ikke om - da f.eks. ikke alle har en e-mail osv. osv.
'Create the Recordset object and run the query Set rsData = New ADODB.Recordset rsData.Open szSQL, szConnect, adOpenStatic, adLockOptimistic, adCmdText
GetCust = Application.WorksheetFunction.Transpose(rsData.GetRows) rsData.Close Set rsData = Nothing
End Function
Og den virker perfekt så længe alle poster i min DB ikke indeholder Null-værdier...
Men det er irreterende at alle felter skal være udfyldt - så hvis du har en løsning på dette...?
Tænkte lige om det er muligt at trasnponerer i ren VB(A) ???
Altså en funktion som ikke er en worksheetfunction?
hvis dine data nu hedder DATA, så kan du gøre sådan her med dem alle DATA = "" & DATA så bliver Null værdier erstattet med en tom string og resten sker der ikke noget med
Hvis nu jeg skal lave en funktion som istedet for at hente skal skrive - hvor skal jeg så rette?
Altså jeg ved godt at jeg skal bruge insert into... men skal jeg rette i den måde jeg åbner ???
Findes der ikke noget hjælp - jeg kan ikke finde noget ADO hjælp i Excel - måske mangler jeg igen en reference ????????? Eller findes der nogle Web-steder for Dummies som mig???
jeg tror heller ikke du kommer uden om problemet, uden at lave din egen transponeringsfunktion. Nu har jeg også prøvet at teste med null-værdier. Hvad med at indsætte et mellemrumstegn i databasen, når når et felt ikke udfyldes ? Du vil jo styre indsættelsen gennem excel-form, så det skulle vel ikke være et problem.
Mht. til sql - ja det fandt jeg ud af men den brokker sig over min sætning og jeg kan ve en eller anden ikke se hvad jeg gør forkert - jeg er nu igang med at indsætte elementerne et ad gang for at se hvor fejlen er men måske du kan se det med det vups?:
tjaaa............ måske et eller flere af disse felter - Postnr, Telefon, Fax, Mobiltelefon - tal skal ikke have de små ' ' omkring sig......... check felt defineringer i din database....
If you decide to use Excel's Transpose method instead of the TransposeDim() function to transpose the array, you should be aware of the following limitations with the Transpose method: The array cannot contain an element that is greater than 255 characters. The array cannot contain Null values. The number of elements in the array cannot exceed 5461. If the above limitations are not taken into consideration when you copy an array to an Excel worksheet, one of the following run-time errors may occur:
Run-time Error 13: Type Mismatch Run-time Error 5: Invalid procedure call or argument Run-time Error 1004: Application defined or object defined error
Function TransposeDim(v As Variant) As Variant ' Custom Function to Transpose a 0-based array (v)
Dim X As Long, Y As Long, Xupper As Long, Yupper As Long Dim tempArray As Variant
Xupper = UBound(v, 2) Yupper = UBound(v, 1)
ReDim tempArray(Xupper, Yupper) For X = 0 To Xupper For Y = 0 To Yupper tempArray(X, Y) = v(Y, X) Next Y Next X
OBS - Den Transpose funktion virker rigtig godt...!!
Synes godt om
Ny brugerNybegynder
Din løsning...
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.