Soms wordt kolom bij Excel import niet ingeladen

Status
Niet open voor verdere reacties.

test1000

Gebruiker
Lid geworden
7 jul 2017
Berichten
258
Hoi,

Ik doe een import van een Excel bestand met 42 kolommen. Excel bevat 2 sheets. Het moet gebruiksvriendelijk zijn. Maw liefst geen aanpassing van de gebruiker aan het Excel bestand laten doen.
Wij ontvangen wekelijks een bestand van de leverancier.
De import verloopt goed maar soms wordt de laatste kolom niet ingeladen. In dit geval kolom E.
Na lang zoeken heb ik de oorzaak gevonden maar niet de oplossing.
Zie printscreen.

In Voorbeeld 1 wordt de laatste kolom ingeladen. Maw de Access tabel bevat waarden voor de laatste kolom.
In Voorbeeld 2 bevat de laatste kolom in de tabel geen waarden. Enkel de titel is aangemaakt.

Waarom wordt in voorbeeld 2 de laatste kolom niet ingeladen ?
Omdat het eerste record dan voor kolom C geen waarde heeft.
Dus kolom C geen waarde dan bevat kolom E ook geen waarde.
Bevat kolom C wel een waarde, zie voorbeeld 1, dan heeft kolom E (in de tabel) wel een waarde.

Voor alle duidelijkheid. Wanneer de laatste kolom geen waarde heeft heeft neem ik hetzelfde bestand.
Vul de waarde 0,00 € in kolom C. Bestand opslaan. Opnieuw importen en lukt het wel.

Wat is de oplossing voor dit wel zeer vreemd fenomeen ?

Hier de import code.

Code:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Tabel", SelectedFile, True, "Sheet2!A1:AP200"

test.JPG
 
Laatst bewerkt:
Waarom heb je een lege kolom? Waarom fixeer je het bereik? Waarom gebruik je geen echte tabel?
 
Dit is een Excel die wij van onze leverancier ontvangen per mail.
Het bestand wordt in een bepaalde folder opgeslagen.
Daarna wordt in Access het bestand geïmporteerd.
Aan de originele Excel kan niets verandert worden.
Wat wij intern wel kunnen doen is de originele Excel gaan aanpassen.
En dan gaat het natuurlijk lukken.
Maar de vraag is : Welke code moet je gebruiken om dit toch te doen lukken ?

Op internet heb ik dit gevonden maar krijg het niet voor mekaar.

Code:
INSERT INTO Table1 (Name, PX_Last, USD, Shares)
SELECT *
  From [Sheet1$D3:E24]
    IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls];
 
Dan moet je even in overleg gaan met de leverancier. In elk Excel bestand kan wat aangepast worden. Volgens mij ben jij de opdrachtgever en dan kan je best wat eisen stellen? Verder lijkt het mij vrij onwaarschijnlijk dat als je een vaste range wil koppelen/importeren dat er een bepaald range niet meekomt. Plaatjes helpen over het algemeen niet zo heel veel. Of het nu om A1:AP200 of D3:E24 gaat wordt er ook niet duidelijker van.
 
Laatst bewerkt:
Het probleem is dat hun Excel uit het SAP programma komt en voor elk van hun klanten worden gemaild.
Dus de vraag is gesteld maar wij zijn een te klein bedrijf om eisen te stellen.

Dan de D3:E24 is de code die ik gevonden had op het internet.
De range heb ik aangepast maar krijg een foutmelding. Dat de FROM instructie niet correct is. Maar wat geeft de foutmelding niet aan.

Maar bestaat er geen code om een Excel, bij wijze van spreken, cell per cell te doen importeren.
Want ik weet dat wanneer het eerste record vb een numeriek veld is maar andere velden zijn alfanumeriek dat heb je soms toch ook problemen.

En de HDR en IMEX code zou dat kunnen helpen of ben ik in de totaal verkeerde richting aan het kijken ?
 
Wat ik meestal doe is de excel eerst importeren naar een werktabel waar alle velden tekstvelden zijn. Deze tabel kan je dan in via queries Access opkuisen en vervolgens naar jou productietabellen overpompen. Je controleert eerst de gegevens en alleen als alle gegevens OK zijn, verwerk je ze in de productie tabellen.
Ook op mijn SQL databases importeer ik alle gegevens eerst naar een import tabel. Daarbij maak ik ook telkens een record aan in aparte tabel Importsessies met datum import, aantal records en eventuele error messages als het fout gaat.
 
Hier had ik al schrik voor dat de gebruiker manuele acties moet uitvoeren.
Als er geen 'softwarematige' oplossing voor is dan zit er niets anders op dan het bestand aan te passen.
Hiermee bedoel ik : bestand vanuit mail save naar folder. In Acces bestand selecteren en importeren.
Zonder de Excel te openen.
 
Als je een bestandje mee post, wil ik er wel naar kijken. Tot die tijd lees ik rustig mee :).
 
Bestand posten waarin bedrijfsgegevens zitten doe ik liever niet.
Op zich is het probleem zeer simpel maar de oplossing is iets anders :)
Zie voorbeeld en code.
Als eerste record in de bewuste kolom geen waarde heeft blijft de laatste kolom leeg.
Als eerste record in de bewuste kolom wel een waarde heeft wordt de laatste kolom wel ingevuld.

En de Access code
Code:
docmd.transferspreadsheet ....
is standaard.

Wat ik mij nu afvraag bestaat er een code om voordat het Excel bestand wordt ingelezen deze te sorteren op bepaalde kolom.
Dan is het probleem ook opgelost. Ga ik de Excel eerst sorteren, aflopende, op de bewuste kolom.
 
Laatst bewerkt:
via VBA kan je gemakkellijk een Excel object aanmaken, het bestand openen en dan gebruik je verder de excel syntax om alles wat je maar wil te coderen in excel.

Hier een oud voorbeeldje over hoe je in access een excel kan openen en er een titelrij aan toevoegen.
Parameters in: strFile met de naam van het bestand, intRows : hoeveel rijen er moeten behandeld worden, astrTitles: array met de titels



Code:
Public Sub AddTitles(strFile As String, intRows As Integer, astrTitles() As String)
On Error GoTo Err_AddTitles

    Dim appExcel As Excel.Application
    Dim bksBooks As Excel.Workbooks
    Dim wkbBook As Excel.Workbook
    Dim wksSheet As Excel.Worksheet
    Dim intArrRow As Integer
    
    
    'Initiate all objects and variables
    Set appExcel = GetObject(, "Excel.Application")
    Set bksBooks = appExcel.Workbooks
    Set wkbBook = bksBooks.Open(strFile)
    Set wksSheet = wkbBook.Sheets(1)
    wksSheet.Activate
    ActiveCell.Rows("1:" & intRows + 1).EntireRow.Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    For intArrRow = 0 To intRows - 1
        Range(astrTitles(intArrRow, 0)) = astrTitles(intArrRow, 1)
    Next intArrRow
    appExcel.Visible = True
    

Exit_AddTitles:
    Exit Sub
    
Err_AddTitles:
    If Err.Number = 429 Then 'excel not running
        Set appExcel = CreateObject("excel.application")
        Resume Next
    Else
        Call gsgErrorHandling
        Resume Exit_AddTitles
    End If

End Sub
 
Bestand posten waarin bedrijfsgegevens zitten doe ik liever niet.

Zie voorbeeld en code.
Niemand hier vraagt om bedrijfsgegevens. Maar geanonimiseerde gegevens moet toch kunnen? Je hebt toch wel een testomgeving met dummy data?

Overigens blijf ik meelezen, want ik zie noch voorbeeld, noch code :).
 
al opgelost test? anders kan je de excel code misschien opvragen op het VBA forum waar alle Office VBA vragen worden beantwoord, lijkt me het beste om vragen te stellen over VBA die verschillende Office programma's omvat.
 
De vraag kan best hier beantwoord worden, als er een bestandje komt. Tot die tijd doe ik (nog steeds) niks :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan