Avatar billede xjln Juniormester
03. december 2003 - 22:13 Der er 5 kommentarer og
1 løsning

"Langhåret" VBA hjælp til sammenlægningen af regnmåler værdier.

Hej NG.

Jeg er kommet på en svær opgave her som jeg håber der er nogen af Jer der
kan hjælpe lidt med.
Fra en regnmåler med datalogger får jeg 1 minutværdier af nedbørsmængden ind
i et regneark.

eks.      A2=03-12-2003 10:00    B2= 0
            A3=03-12-2003 10:01    B3=2
            A4=03-12-2003 10:02    B4=1
            A5=03-12-2003 10:03    B5=0
            -
            -
            -
            A65=03-12-2003 11:03    B65=0
            A66=03-12-2003 11:04    B66=2
osv.

Disse værdier skal jeg have lagt sammen på en bestemt måde således de kan
bruges i et andet beregningsprogram.
Her er det jeg er gået i stå, jeg mangler en rutine der kan flytte/kopiere
værdierne i kolonne A og B til andre kolonner i arket.
Døgnets værdierne i kolonne B skal dog deles i en eller flere perioder. 2
perioder er adskilt af mindst 60 min. uden regn, altså værdien i B er = 0.

Som vist i eksemplet ovenfor kommer første registrering 10:01 og "sidste"
10:02 derefter er der mere end 60 minutter til næste registrering og dette
tæller så for en periode og værdierne i A3, A4, B3 og B4 ønskes derfor
flyttet/kopieret  til f. eks. kolonne G og H.

Jeg kan ikke lige hitte ud af det måske I kan.
Håber I kan se problematikken ellers vend tilbage.

På forhånd tak

J. Nielsen
Avatar billede kabbak Professor
04. december 2003 - 20:14 #1
sættes i et modul

Public Sub TjekVand()
Dim DRng As Variant, ResRng As Variant, R As Double, G As Double, I As Double
A = Range("B65536").End(xlUp).Address ' finder den sidste celle der er brugt i B  kolonnen
B = Range("B65536").End(xlUp).Row
DRng = Range("A2:" & A) ' inlæser området i A + B kolonnen
Range("G1:H" & B).ClearContents ' tømmer skrive området
  ResRng = Range("G2:H" & B)  ' området til udkrifter G + H kolonnen
 
  For I = 1 To UBound(DRng) ' fjerner øverste 0 værdier
    If DRng(I, 2) > 0 Then
    R = I
    GoTo Start
    End If
    Next I
   
'******************************** Starter ved første værdi over 0 *****************
Start:
For R = R To UBound(DRng)
 
  If DRng(R, 2) = 0 Then
    For I = R To UBound(DRng)
    If I = UBound(DRng) Then GoTo OK ' Hvis enden er nået med 0er, afsluttes
      If DRng(I, 2) > 0 Then
      If I - R >= 60 Then  ' tjekker om der 60 eller mere i træk
        R = I
        GoTo Skriv
        Else
        If I = UBound(DRng) Then GoTo OK
        GoTo Skriv
      End If
      End If
  Next I
  End If
'*************************************        ***************************
Skriv:

    For G = 1 To UBound(ResRng)
      If ResRng(G, 2) = "" Then
      ResRng(G, 2) = DRng(R, 2)
      ResRng(G, 1) = DRng(R, 1)
      GoTo Videre
      End If
    Next G

'************************************            *************************
Videre:
Next R
OK:
For G = 1 To UBound(ResRng)
If ResRng(G, 1) = "" Then Exit Sub
Range("G" & G) = ResRng(G, 1)
Range("H" & G) = ResRng(G, 2)
Next

End Sub
Avatar billede xjln Juniormester
05. december 2003 - 09:27 #2
Hej Kabbak

Det må jeg sige her har du virkelig gjort et flot stykke arbejde.
Der er dog en lille hage.
Jeg fik vist ikke udtrykt mig rigtigt i spørgsmålet, men mit egnetlige ønske var at "første" periode skulle placeres i kolonne G og H, "anden" periode placeres i kolonne I og J osv.
I den fine kode du har lavet kommer de fortløbende efter hinanden.
Kunne evt. komme med et par hints til det?

Mvh
Jakob
Avatar billede kabbak Professor
05. december 2003 - 10:28 #3
Nu kan den klare 9 perioder, hvis der skal være flere, så giv lige besked

Public Sub TjekVand()
Dim DRng As Variant, ResRng As Variant, R As Double, G As Double, I As Double, K As Integer
A = Range("B65536").End(xlUp).Address ' finder den sidste celle der er brugt i B  kolonnen
B = Range("B65536").End(xlUp).Row
DRng = Range("A2:" & A) ' inlæser området i A + B kolonnen
Range("G1:Y" & B).ClearContents ' tømmer skrive området
  ResRng = Range("G2:Y" & B)  ' området til udkrifter G + H kolonnen
  K = 1
  For I = 1 To UBound(DRng) ' fjerner øverste 0 værdier
    If DRng(I, 2) > 0 Then
    R = I
    GoTo Start
    End If
    Next I
   
'******************************** Starter ved første værdi over 0 *****************
Start:
For R = R To UBound(DRng)
 
  If DRng(R, 2) = 0 Then
    For I = R To UBound(DRng)
    If I = UBound(DRng) Then GoTo OK ' Hvis enden er nået med 0er, afsluttes
      If DRng(I, 2) > 0 Then
      If I - R >= 60 Then  ' tjekker om der 60 eller mere i træk
        R = I
        K = K + 2
        GoTo Skriv
        Else
        If I = UBound(DRng) Then GoTo OK
        GoTo Skriv
      End If
      End If
  Next I
  End If
'*************************************        ***************************
Skriv:

    For G = 1 To UBound(ResRng)
      If ResRng(G, K + 1) = "" Then
      ResRng(G, K + 1) = DRng(R, 2)
      ResRng(G, K) = DRng(R, 1)
      GoTo Videre
      End If
    Next G

'************************************            *************************
Videre:
Next R
OK:
For H = 1 To K
For G = 1 To UBound(ResRng)
If ResRng(G, H) = "" Then GoTo NyGruppe
Cells(G, H + 6) = ResRng(G, H)
Cells(G, H + 7) = ResRng(G, H + 1)
Next
NyGruppe:
Next
End Sub
Avatar billede kabbak Professor
05. december 2003 - 16:44 #4
En ny, den udvider sig til flere serier efter behov

Public Sub TjekVand()
Dim DRng() As Variant, ResRng As Variant, R As Double, G As Double, I As Double, K As Integer
A = Range("B65536").End(xlUp).Address ' finder den sidste celle der er brugt i B  kolonnen
B = Range("B65536").End(xlUp).Row
DRng = Range("A2:" & A) ' inlæser området i A + B kolonnen
ReDim ResRng(B, 2) 'Dim af udlæsnings område
  K = 0
  For I = 1 To UBound(DRng) ' fjerner øverste 0 værdier
    If DRng(I, 2) > 0 Then
    R = I
    GoTo Start
    End If
    Next I
   
'******************************** Starter ved første værdi over 0 *****************
Start:
For R = R To UBound(DRng)
 
  If DRng(R, 2) = 0 Then
    For I = R To UBound(DRng)
    If I = UBound(DRng) Then GoTo OK ' Hvis enden er nået med 0er, afsluttes
      If DRng(I, 2) > 0 Then
      If I - R >= 60 Then  ' tjekker om der 60 eller mere i træk
        R = I
        K = K + 2
        ReDim Preserve ResRng(B, K + 2) 'ReDim af udlæsnings område (flere kolonner)
        GoTo Skriv
        Else
        If I = UBound(DRng) Then GoTo OK
        GoTo Skriv
      End If
      End If
  Next I
  End If
'*************************************        ***************************
Skriv:

    For G = 1 To UBound(ResRng)
      If ResRng(G, K + 1) = "" Then
      ResRng(G, K + 1) = DRng(R, 2)
      ResRng(G, K) = DRng(R, 1)
      GoTo Videre
      End If
    Next G

'************************************            *************************
Videre:
Next R
OK:
For H = 0 To K Step 2
For G = 1 To UBound(ResRng)
If ResRng(G, H) = "" Then GoTo NySerie
Cells(G, H + 7) = ResRng(G, H) ' starter i kolonne G
Cells(G, H + 8) = ResRng(G, H + 1)
Next
NySerie:
Next
End Sub
Avatar billede xjln Juniormester
06. december 2003 - 20:09 #5
Hej Kabbak

Mange tak for hjælpen med koden, nu skal jeg "bare" have behandlet tallene således de kan bruges i programmet.

200p til dig

Mvh.
Jakob
Avatar billede kabbak Professor
06. december 2003 - 23:21 #6
tak for points ;-))
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester