24. marts 2004 - 10:30Der er
22 kommentarer og 2 løsninger
hjlæp til læs fra excel og for sætning
Jeg er ved at lave et modul til at udskrive indholdet af et excelregneark. problemet er at jeg ikke på forhånd ved hvormange ark der er brugt, så jeg skal gennemløbe ark 1 til 50 for at tjekke om der er lagt data i dem. Hvis der er data i skal det udskrives.
Jeg har lavet følgende kode:
'Tjekker ark 1 til 50. Systemet her han håndtere 50 løb For t = 1 to 50 xlsRS.Open "SELECT * from `"& t &"$A1:E15`", xlsConn, 1, 2
'Springer de tomme ark over If xlsRS.EOF OR xlsRS.BOF Then Next
%> <% xlsRS.movenext Do while not xlsRS.eof OR xlsRS.bof %> <tr> <td><%=xlsRS(0)%></td> <td><%=xlsRS(1)%></td> <td><%=xlsRS(2)%></td> <td><%=xlsRS(3)%></td> <td><%=xlsRS(4)%></td> </tr> <% xlsRS.movenext loop %> </table><br><br> <% Next %>
Problemet er at den ikke kan finde ud ag følgende:
'Springer de tomme ark over If xlsRS.EOF OR xlsRS.BOF Then Next
---------------- Fejl --------------------- Microsoft VBScript compilation error '800a041f'
Unexpected 'Next'
/Default.asp, line 25
If xlsRS.EOF OR xlsRS.BOF Then Next -------------------------------^
'Tjekker ark 1 til 50. Systemet her han håndtere 50 løb For t = 1 to 50 xlsRS.Open "SELECT * from `"& t &"$A1:E15`", xlsConn, 1, 2
'Springer de tomme ark over If Not (xlsRS.BOF And xlsRS.EOF) Then
%> <% xlsRS.movenext Do while not xlsRS.eof OR xlsRS.bof %> <tr> <td><%=xlsRS(0)%></td> <td><%=xlsRS(1)%></td> <td><%=xlsRS(2)%></td> <td><%=xlsRS(3)%></td> <td><%=xlsRS(4)%></td> </tr> <% xlsRS.movenext loop %> </table><br><br> <% End If Next %>
for løkken skulle gerne styre de enkelte ark, og xlsRS styre dataen der er i hvert ark. Så hvis der ikke er data på et ark, så skal der skiftes til et nyt ark.
'Tjekker ark 1 til 50. Systemet her han håndtere 50 løb For t = 1 to 50 strSQL = "SELECT * from `"& t &"$A1:E15`" Set xlsRS = xlsConn.Execute(strSQL)
'Springer de tomme ark over If Not (xlsRS.BOF And xlsRS.EOF) Then while Not xlsRS.EOF %> <tr> <td><%=xlsRS(0)%></td> <td><%=xlsRS(1)%></td> <td><%=xlsRS(2)%></td> <td><%=xlsRS(3)%></td> <td><%=xlsRS(4)%></td> </tr> <% xlsRS.MoveNext() Wend End If %> </table><br><br> <% Next %>
ville det være smartere at løbe hele xls dokumnetet i gennem til at starte med, og så smide ark navnet ind i et array der hvor arket indeholder data. Så behøvede jeg ikke længere nede at tjekke om arket var tomt?
Så nu tror jeg at jeg har fået det til at virke, men har nu følgende problem:
Nedenstående linje:
Set xlsRS = xlsConn.Execute("SELECT * from `"& t &"$A1:E15`")
Giver følgende fejl:
Microsoft JET Database Engine error '80040e37'
The Microsoft Jet database engine could not find the object '4$A1:E15'. Make sure the object exists and that you spell its name and the path name correctly.
/Default.asp, line 26
Har jeg nogen mulighed for at gribe den fejl. Hvis jeg eksempelvis indsætter:
On Error Resume Next
Så får jeg ingen fejl, men så får jeg 50 tomme rækker ud, og dem ville jeg jo gerne undgå???
<% 'Laver de instanser der skal anvendes Set xlsConn = Server.CreateObject("ADODB.Connection") Set xlsRS = Server.CreateObject("ADODB.Recordset")
'Inkludere database connection %> <!--#include virtual="/includes/db.asp"--> <% 'On Error Resume Next 'Antallet af ark der skal tjekkes i .xls filen intAntalArk = 50
'Henter xls filnavnet ud fra databasen, for at sikre at det altid er den sidst uploadede fil der bliver anvendt set Rs = Conn.Execute("SELECT FileName FROM xlsliste WHERE id = 1;") strFileName = Rs(0)
'Opbygger link index For t = 1 to intAntalArk Set xlsRS = xlsConn.Execute("SELECT * from `"& t &"$A1:E15`") If not (xlsRS.eof OR xlsRS.bof) Then Response.write("<a href='#"&t&"'>Løb "& t &": "& xlsRS(1) &"</a><br>") End if Next
'Udskriver indhold af arkne i .xls filen For t = 1 to intAntalArk Set xlsRS = xlsConn.Execute("SELECT * from `"& t &"$A1:E15`")
'Springer de tomme ark over If Not (xlsRS.BOF And xlsRS.EOF) Then %> <table border="0" width="600" cellpadding="0" style="font-family: verdana; font-size: 10pt;"> <tr> <td><a name="<%=t%>"><b>Løb <%=t%></b></a></td> <td colspan="4"><b><%=xlsRS(1)%></b></td> </tr> <tr> <td>Bane</td> <td>Navn</td> <td>klub</td> <td>Tid</td> <td>Tid</td> </tr> <% xlsRS.movenext Do while not xlsRS.eof OR xlsRS.bof %> <tr> <td width="50"><%=xlsRS(0)%></td> <td width="300"><%=xlsRS(1)%></td> <td width="200"><%=xlsRS(2)%></td> <td width="75"><%=xlsRS(3)%></td> <td width="75"><%=xlsRS(4)%></td> </tr> <% xlsRS.MoveNext() loop %> </table><br><br> <% End if Next %>
<% 'Cleanup xlsRS.Close xlsConn.Close Conn.close Set conn = Nothing Set rs = Nothing Set slxRS = Nothing Set xlsConn = Nothing %>
----------------------- Kode slut --------------------------
Jeg har prøvet at oprette alle 50 ark i excel filen, og så bare lade nogle af arkne være tomme, men så brokker den sig stadig, selvom jeg synes jeg tjekker for om arket er tomt:
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.
/Default.asp, line 28
------------------ kode omkring linje 28 ------------------ 'Opbygger link index For t = 1 to intAntalArk Set xlsRS = xlsConn.Execute("SELECT * from `"& t &"$A1:E15`") If not (xlsRS.eof OR xlsRS.bof) Then Response.write("<a href='#"&t&"'>Løb "& t &": "& xlsRS(1) &"</a><br>") End if Next
If not (xlsRS.eof OR xlsRS.bof) Then = Hvis ikke den er EOF (End Of File) eller BOF (Begin Of File) Det vil sige, hvis recorden ikke findes, så skal den ikke gøre noget, hvis den findes udfører den statementsne i If...Then.
Grunden til at der kommer en fejl i din Response.Write() er at der ikke er en xlsRS(1)
Prøv evt. at skriv xlsRS(0).
Hvis feltet i dit excell ark ikke findes, vil den melde en fejl, jeg mener ikke man kan lave en forespørgsel på om et felt findes :-/
Prøv evt. at skriv UBound(xlsRs) og se hvad du får af resultat, hvis du kan gøre det kan du jo sige at hvis din UBOUND er under 1 så kan det kun være 0, osv.
Jeg tror ikke jeg kommer det meget nærmere, så længe jeg bruger On Error Resume Next, så går det som det skal. Jeg må jo erkende at excel ikke er det samme som Access
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.