Avatar billede gskairo Nybegynder
28. januar 2008 - 13:28 Der er 13 kommentarer og
1 løsning

Gennemsnit af data fra flere sheets

Jeg har X antal sheets. Disse skal der laaves et gennemsnit af værdierne i feltene B2 -> Bxx til J2->Jxx ( hvor xxx indtastets i startena af macroen) men antallet af sheets er varierende ( dette kunne dog godt indtastes i starten også men det ville være nemmere hvios det ikke behøves)
Disse værdier skal ligges i et nyt sheet. Jeg kan ikke finde en funktion der lader mig variere antallet af felter der kikkes i.

Er der nogle der har en mulig løsning?
Avatar billede jkrons Professor
28. januar 2008 - 14:18 #1
Er det altid alle sheets, der skal med i beregningen?
Avatar billede gskairo Nybegynder
28. januar 2008 - 14:30 #2
ja det er det. Det er fra sheet 1 til sheet x.
Avatar billede jkrons Professor
28. januar 2008 - 14:38 #3
Yderligere et spørgsmål:
Skal du have en gennemsnit for hvert af arkene, eller skal du bare have et samlet gennemsnit for alle værdier i alle ark?
Avatar billede jkrons Professor
28. januar 2008 - 14:45 #4
Hvis det er snittet af alle de udpegede data i all ark, kan du bruge denne funktion, som bruges som alle andre funktioner. I parentesen skl du så angive nummeret på sidste række:

Function snitter(rknr As Long) As Double
Dim res As Double
Dim cou As Double

For Each s In ActiveWorkbook.Sheets
    For Each c In Range("b2:J" & rknr).Cells
        res = res + c.Value
        If Not IsEmpty(c.Value) Then
            cou = cou + 1
        End If
    Next c
Next s
snitter = res / cou

End Function
Avatar billede gskairo Nybegynder
28. januar 2008 - 15:14 #5
så jeg skal indsætte rknr?
Avatar billede jkrons Professor
28. januar 2008 - 15:15 #6
ja, skriv bare rækkenummeret for sidste række (xxx) i parentesen.
Avatar billede jkrons Professor
28. januar 2008 - 15:24 #7
Hvis du skal have snittet for hvert ark indsat for sig, kan du bruge noget i denne stil. Bare sørg for, at arket hvor resultaterne indsættes altid er det sidste i mappen

Sub Snit()
    Dim res As Double
    Dim cou As Double
    Dim Snit As Double
    rknr = InputBox("Indtast nummer på sidste række")
    snr = 1
    For Each s In ActiveWorkbook.Sheets
        res = 0
        cou = 0
        For Each c In s.Range("b2:J" & rknr).Cells
            res = res + c.Value
            If Not IsEmpty(c.Value) Then
                cou = cou + 1
            End If
        Next c
        On Error Resume Next
        Snit = res / cou
        Sheets(Sheets.Count).Range("a" & snr) = res / cou
        snr = snr + 1
    Next s
End Sub
Avatar billede gskairo Nybegynder
29. januar 2008 - 08:10 #8
Det ser ud til dit script gør noget lidt anderledes end hvad jeg har brug for.

jeg skal bruge snittet for hver celle i de foregående sheets. Alså sinttet for A1 kommer i A1 og snittet af alle A2 kommer i A2 ect... frem til Yxx

således jeg kan lave en graf ud fra disse data.

Dit script ser ud til at lave et snit for alle værdierne på siden. og retunere kun 4 værdier.
Avatar billede gskairo Nybegynder
29. januar 2008 - 09:43 #9
PT ser min kode sådanne ud

Sub Summering()
      '
' MakeSummary Macro
' '
    Sheets("SUMMARY").Select
'  Clear the existing values (if any)
    Range("$A$1:$Y$999").Value = ""
'  J tracks the row number on the summary page
'  I tracks the sheet number being processed
    J = 2
    rk = 60 + 1 ' Givet fra mainsheet vr * pr
     
     
    For I = 4 To Sheets.Count 'tæller antallet af sheets og slutter når den når til 4
        A$ = Sheets(I).name ' Sheet numret
        t$ = I
        If (A$ = "SUMMARY") Then GoTo 10 ' Skipper gennemsnits siden så den ikke lægges til sig selv.
      ' If (Sheets(a$).Range("$C$1").Value = "") Then GoTo 10 ' Springer også ovre sheets uden navne
    For ra = 1 To rk
    e$ = ra
     
'  Process the current sheet
      ' Range("A" + Format(2))
        Range("A" + Format(e$)).FormulaR1C1 = "='" + A$ + "'!R" + e$ + "C" + t$ '+ Range("e$" + Format(e$)).FormulaR1C1 'range("plads i Summary dokumentet" + Rækken som det skal sættes ind på.
        'Sheets("Sheet1").Cells(Row, Col).Value
       
        'Range("A" + Format(e$)).FormulaR1C1 = "='" + a$ + "'!R" + e$ + "C" + t$ '+ Range("e$" + Format(e$)).FormulaR1C1 'range("plads i Summary dokumentet" + Rækken som det skal sættes ind på.
        'Range("B" + Format(e$)).FormulaR1C1 = "='" + a$ + "'!R2C" + e$ '+ Range("e$" + Format(e$)).FormulaR1C1
        'Range("C" + Format(e$)).FormulaR1C1 = "='" + a$ + "'!R2C" + e$ ' + A$ er dokument navnet og "'!R2C3" er pladsen som det hentes på
        'Range("C" + Format(J)).FormulaR1C1 = "='" + a$ + "'!R2C4" ' skal ændres til range(cells(x,y)) eller noget i den stil
              J = J + 1 ' Flytter pladsen talles sættes på på sum siden
        Next ra
       
10    Next I

End Sub
Men jeg kan ikke finde en funktion der tæller A op i denne line
Range("A" + Format(e$)).FormulaR1C1 = "='" + A$ + "'!R" + e$ + "C" + t$
for resultatet er at alle værdierne skrives oven i hinanden og dermed slettes.

(legeledes er der ingen sum funktion endnu men det kommer når jeg kan gemme funktionernes værdier.
Avatar billede jkrons Professor
29. januar 2008 - 22:46 #10
Jeg kan ikke helt genneskue, hvad er det er, du ønsker at opnå, men denne kode indsætter formeler i det sidste ark i mappen, i samme celler, som brugt i Ark1, der beregneer gennemnittet af hver af disse celler i hvert ark, og skriver resultatet i det sidste.

Sub Snit()
    Dim a As Integer
    Dim x As Integer
   
    rknr = InputBox("Indtast nr på sidste række")
    a = Sheets.Count
   
    Sheets(a).Select
    ActiveSheet.Range("b2:d" & rknr).Select
    For Each c In Selection.Cells
        c.FormulaLocal = "=MIDDEL(" & Sheets(1).Name & ":" & Sheets(a - 1).Name & _
          "!" & c.Address & ")"
    Next c
End Sub

Hvis det ikek er det du ønsker, må jeg nok melde fra.
Avatar billede excelent Ekspert
30. januar 2008 - 06:25 #11
Gætter på der menes at ark SUMMARY A1 skal indeholde snittet af alle øvrige arks A1
og ark SUMMARY A2 skal indeholde snittet af alle øvrige arks A2 osv.

Sub Summary()
Sheets("SUMMARY").Select
x = 6

For rk = 1 To x ' ret x til aktuel
  For kol = 1 To 10 'til kolonne J ret evt.
    For Each sh In ActiveWorkbook.Sheets
      If sh.Name <> "SUMMARY" Then
        tal = tal + sh.Cells(rk, kol)
      End If
      Next
      Sheets("SUMMARY").Cells(rk, kol) = tal / (Sheets.Count - 1)
    tal = 0
  Next
Next

End Sub
Avatar billede gskairo Nybegynder
30. januar 2008 - 08:13 #12
excelent Det virker! Jeg elsker dig og vil opkalde min først fødte efter dig :-)

Mange tak for hjælpen det var lige det jeg skulle bruge. Nu skal den abre ordnes så der ikke går ged i den hvis der er er en tekst værdi i cellen. Men det må være til at lave :-D
Avatar billede excelent Ekspert
30. januar 2008 - 09:18 #13
prøv:

Sub Summary()
Sheets("SUMMARY").Select
x = 6

For rk = 1 To x ' ret x til aktuel
  For kol = 1 To 10 'til kolonne J ret evt.
    For Each sh In ActiveWorkbook.Sheets
      If sh.Name <> "SUMMARY" Then
        If IsNumeric(sh.Cells(rk, kol)) Then tal = tal + sh.Cells(rk, kol)
      End If
      Next
      Sheets("SUMMARY").Cells(rk, kol) = tal / (Sheets.Count - 1)
    tal = 0
  Next
Next

End Sub
Avatar billede excelent Ekspert
01. februar 2008 - 11:26 #14
husk lige at lukke - også dine gamle spørgsmål
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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