• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Twee systemen aan elkaar gelijk schakelen middels een uploadfile met VBA

Status
Niet open voor verdere reacties.

Antonisse1

Gebruiker
Lid geworden
31 mei 2008
Berichten
133
Goedemiddag,
ik heb de volgende uitdaging voor me liggen, maar kom er niet uit.
Wie kan me helpen?
In kolom A tm F (zie bijgaande file) heb ik een overzicht van voorraden in 2 systemen in verschillende magazijnen. Systeem B geeft het leading overzicht. Systeem A moet, indien mogelijk, hier naadloos bij aansluiten. Eventuele verschillen die overblijven mogen in systeem A blijven staan.

Ik heb te maken met duizenden items, handmatig is dit nogal tijdrovend werk.
De gewenste uploadfile voor systeem A staat in de kolom J tm S. Voor beide files geldt dat dit eigenlijk de gewenste layout is.
Hoe kan ik het trucje, dat moet plaatsvinden om de gegevens juist in de uploadfile te krijgen, automatiseren mbv. Visual Basic?
Ik heb verstand van Visual Basic en maak wel eens een programma, maar dit gaat me nog boven de pet, terwijl ik het idee heb dat het wel kan.
Indien u mij een advies of tip kunt geven over hoe ik het programma kan maken, dan is dit ook zeer welkom.
Als u mij kunt helpen of nog vragen heeft, dan houd ik mij aanbevolen. Ik wil u alvast hartelijk danken voor de genomen moeite ernaar te kijken.

Vriendelijke groeten,
David Antonisse
 

Bijlagen

In principe kun je dit exact hetzelfde oplossen als je andere probleem . Met dit verschil dat je nu niet alleen kijkt naar posten die 100% mappen op het tekort, maar ook fracties

Ik neem dan even aan dat kolom A weer de definieerende groep is
 
Laatst bewerkt:
Reactie

Goedemiddag,

ik heb uw programma proberen om te bouwen om de gewenste uploadfile te krijgen in de bijgeleverde file. De verschilkolom had ik verplaatst naar kolom F. Nu loopt de module vast met de melding dat er voor 'paren' en matrix wordt verwacht.

Kunt u mij daar een tip geven wat ik hier fout doe?

Alvast hartelijk dank en een fijne dag!

Groet,
David Antonisse
 
Waar ongeveer? Indien je je code plaatst in je voorbeeld kan ik er ook naar kijken. mogelijk is het slechts een kleine actie
 
Reactie

Goedemiddag wampier,

ik heb nu de volgende code. Het is nog zeer ruw en bevat veel gekopieerde regels.
Vlak na regel 50 in uw code met remarks begint de foutmelding te verschijnen. Op een of andere manier bevat de variabele paren geen matrix.

Groet en reuze bedankt voor de hulp!

David
 

Bijlagen

er missen haakjes achter de definitie van "paren". Je hebt:

Dim paren As Range

het moet zijn

Dim paren() As Range
 
Reactie

Ok bedankt!

Ik zal dit verbeteren en hoop er dan uit te komen.


Groetjes,
David Antonisse
 
Reactie

Ik ben aan het stoeien geweest, ik krijg het programma echter niet lopend. Programmeren met subroutines etc vind ik toch nog vrij lastig.

Vriendelijke groet,
David Antonisse
 
In het voorbeeld, wat bepaald kolom "N" ? Ik neem aan dat er foutje staat op regel 7 ?

Code:
Option Explicit
Option Base 0
Type opslag
    loc As Range
    waarde As Long
End Type

Sub test()
Dim begin As Range
Dim eind As Range
Dim i As Long
Set begin = [a3]
Set eind = LookAhead(begin.Value, begin)
While eind.Offset(1).Value <> ""
    Call CheckRange(begin, eind)
    Set begin = Range(eind.Offset(1), eind.Offset(1))
    Set eind = LookAhead(begin.Value, begin)
Wend
Call CheckRange(begin, eind)

End Sub

Function LookAhead(waarde As String, startlocatie As Range) As Range
Dim einde As Range
Dim cell As Range
Set einde = startlocatie.Offset(300000).End(xlUp)
For Each cell In Range(startlocatie, einde)
    If cell.Value <> waarde Then
        Set LookAhead = cell.Offset(-1)
        Exit For
    End If
Next cell

If LookAhead Is Nothing Then
    Set LookAhead = einde
End If
End Function

Sub CheckRange(begin As Range, eind As Range)

Dim i As Long
Dim j As Long
Dim paren() As opslag
Dim tekorten() As opslag
ReDim tekorten(0)
ReDim paren(1, 0)
Dim cell As Range

For Each cell In Range(begin.Address, eind.Address)
    Set tekorten(UBound(tekorten)).loc = cell
    tekorten(UBound(tekorten)).waarde = cell.Offset(0, 7).Value
    ReDim Preserve tekorten(UBound(tekorten) + 1)
Next cell

ReDim Preserve tekorten(UBound(tekorten) - 1)

For i = 0 To UBound(tekorten)
    If tekorten(i).waarde < 0 Then
        For j = 0 To UBound(tekorten)
            If tekorten(j).waarde >= Abs(tekorten(i).waarde) Then
                paren(1, UBound(paren, 2)).waarde = Abs(tekorten(i).waarde)
                tekorten(j).waarde = tekorten(j).waarde - Abs(tekorten(i).waarde)
                tekorten(i).waarde = 0
                Set paren(0, UBound(paren, 2)).loc = tekorten(i).loc
                Set paren(1, UBound(paren, 2)).loc = tekorten(j).loc
                ReDim Preserve paren(1, UBound(paren, 2) + 1)
                Exit For
            End If
            If (tekorten(j).waarde > 0) And (tekorten(i).waarde < 0) Then
                paren(1, UBound(paren, 2)).waarde = Abs(tekorten(j).waarde)
                tekorten(i).waarde = tekorten(i).waarde + tekorten(j).waarde
                tekorten(j).waarde = 0
                Set paren(0, UBound(paren, 2)).loc = tekorten(i).loc
                Set paren(1, UBound(paren, 2)).loc = tekorten(j).loc
                ReDim Preserve paren(1, UBound(paren, 2) + 1)
            End If
        Next j
    End If
Next i

If UBound(paren, 2) Then
    ReDim Preserve paren(1, UBound(paren, 2) - 1)
    For i = 0 To UBound(paren, 2)
        With [K50000].End(xlUp).Offset(1)
            .Value = paren(1, i).loc.Offset(0, 2).Value
            .Offset(0, 1).Value = paren(0, i).loc.Offset(0, 2).Value
            .Offset(0, 2).Value = paren(0, i).loc.Value
            .Offset(0, 3).Value = paren(1, i).loc.Offset(0, 1).Value
            .Offset(0, 4).Value = paren(1, i).waarde
        End With
    Next i
End If

End Sub
 
Laatst bewerkt:
Geweldig Wampier!

Ik begrijp dat regel 7 onduidelijkheden geeft, in LOT lijkt daar iets niet goed te zitten. Eerlijk gezegd zou ik moeten nakijken of dit in werkelijkheid kan voorkomen.
Ik ga uw programma dadelijk even testen.

Ik ben zeer content met uw hulp, ook met het vorige programma heeft u mij erg goed geholpen! Heel hartelijk dank voor de tijd die u er in heeft gestoken!!

Kunt u mij nog een tip geven waar ik mijn programmeerniveau wat omhoog kan brengen. Ik kan wat eenvoudige programma's schrijven, echter bijv. uw routines, en subroutines en enkele codes zijn voor mij nog lastig te ontwerpen.

Ik laat u aanstonds even weten hoe uw programma het doet.

Vriendelijke groet en alvast een fijne dag toegewenst!

David Antonisse
 
Je gebruikt in principe al routines. veel commando's die je nu gebruikt zijn in principe ook al routines, maar ingebakken in VBA. Ik gebruik eigen routines niet zeer vaak in VBA, maar in dit geval waren een aantal duidelijke repetatieve stappen die uitgevoerd konden worden. Ook kun je je programma wat eenvoudiger "debuggen"

Het uitwerken van de stappen is het belangrijkst. Zoals ik al mijn post in het andere topic heb vermeld is het een kwestie van terug werken en stappen goed onderscheiden. Ik heb de twee hoofdstappen in een eigen routine gezet, zodat beide eenvoudig aangeroepen en onafhankelijk getest kunnen worden. In principe is de code ook wel te schrijven zonder subroutines maar de enorme brij die dat op gaat leveren wordt snel onleesbaar en veel code moet dan telkens herhaald worden.

Ervaring en leren debuggen zijn ook belangrijk. mijn originele code staat vol van de "msgbox" commando's om te meten wat er gebeurt. Ook breakpoints zijn regelmatig toegepast. Ik heb ongeveer 7 "pogingen" moeten doen om de bestaande code om te bouwen naar deze. veelal kleine foutjes die snel te herleiden zijn met een msgbox en breakpoint. "Option strict" is ook handig om bij langere code in te schakelen. Veelal gebruik ik voor kleine macro's geen "strict", omdat de code overzichtelijk is en typefouten snel te vinden zijn. Bij option strict geeft een typefout in een variabele een error en dat is bij zeer lange code wel een groot voordeel.

Als laatste: niet bang zijn en er de tijd voor nemen. test je probeersels met msgbox en breakpoints en probeer te begrijpen waarom de code wat anders doet dan je denkt dat zou moeten gebeuren. voer code stap voor stap uit. geeft eventueel kleurtjes aan cellen zodat je visueel kan volgen wat er gebeurt.
 
Bedankt wampier,

nog even een beginnersvraag :). Hoe zet ik iedere keer een msgbox in mijn code, zodat ik beter fouten kan opsporen?

Nog heel erg bedankt voor alles!!

Groet,
David Antonisse
 
Je kunt bijvoorbeeld na:
Code:
Sub CheckRange(begin As Range, eind As Range)
zoiets als dit plaatsen:

msgbox(begin.address & " " & eind.address)

elke keer dat de sub wordt aangeroepen krijg je dan eerst een popup met de referentie-waarden die in "begin" en "eind" staan. Je kunt dan controleren of de waarden die binnenkomen overeenkomen met je verwachting. In dit geval zouden de adressen overeen moeten komen met de begincel en eindcel van een blok codes, zoals "AAA", "BBB", etc.
 
heel mooi gemaakt wampier

een opmerking:
als je in kolom D (Systemen A) in de rijen 3 en 5 de waarden verwisseld,
dan krijg je een extra handeling
1 2 SSS a 5
3 2 SSS b 5
in plaats van:
1 2 SSS a 10

het eind resultaat is in orde
maar er moeten 2 tickets gebruikt worden
David, moet dit voorkomen worden of maakt het niet uit

groet sylvester
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan