Avatar billede oyejo Nybegynder
07. februar 2005 - 12:34 Der er 17 kommentarer og
1 løsning

VBA-kode for Range, ved å benytte Cells og variabler

Har et regneark med måledata, disse data danner grunnlag for diagrammer.

Skal ved help av variabler prøve å anngi områdene som skal benyttes. Slik at jeg kan benytte VBA til å angi sourcedata for hvert enkelt diagramm.

I kolonne A står Datotid. ( dette er x-aksen )

I rad nr. 6 står kolonneoverskrifter, disse benyttes til labels

Rad nr. 7 skal IKKE være med i datagrunnlaget(kun for kontroll)

Datagrunnlaget ligger fra Rad 8 og ned til siste rad.
I Celle "A6" står det et tall ( prosjektnummer )
KAN DET VÆRE INNHOLDET I DENNE CELLEN SOM SKAPER PROBLEMER?

Prøver å angi et Range til et diagramm skal ha....

DatoTid ( kolonne A)  og data fra kolonne 4 og 5 Hvordan kan jeg angi området med variabler, slik at jeg får med kolonneoverskriften i rad 6?

Har prøvd med med denne koden:

With ActiveChart
      .SetSourceData Source:=Sheets(vScrcSht(n)(1)). _
      Range(Cells(lRwOffst, 1), Cells(lRwOffst, 1), _
        Cells(lRwOffst + 2, 1), Cells(lgLR, 1), _
        Cells(lRwOffst, a), Cells(lRwOffst, b), _
        Cells(lRwOffst + 2, a), Cells(lgLR, b)), _       
        PlotBy:=xlColumns
      With .Axes(xlCategory)
        .MinimumScale = lgDyNr(n)
        .MaximumScale = lgDyNr(n + 2)
      End With
    End With

Får feilmeldingen.
Run-time error '1004'
method 'cells' of object '_Global' failed

Det kan se ut til at variablene har korekte verdier, men at det er noe galt med angivelse av range.

Håper dette ikke ble alt for uforståelig :-)
Avatar billede oyejo Nybegynder
07. februar 2005 - 12:37 #1
Når kollonneoverskriftene skal med, kan range bestå av 4 forskjellige, ikke sammenhengende områder.
Avatar billede oyejo Nybegynder
07. februar 2005 - 12:40 #2
Når jeg angir området manuelt, blir det slik:

=Drift1!$A$6;Drift1!$A$8:$A$400;Drift1!$H$6:$N$6;Drift1!$H$8:$N$400
Avatar billede oyejo Nybegynder
07. februar 2005 - 13:59 #3
Det vil være godt nok svar, hvis jeg kan få VBA koden, for dette området:
=Drift1!$A$6;Drift1!$A$8:$A$400;Drift1!$H$6:$N$6;Drift1!$H$8:$N$400
Jeg tror løsningen må benytte Cells(), slik at jeg kan putte inn mine variabler.
Avatar billede sjap Praktikant
07. februar 2005 - 14:37 #4
oyejo > Har ikke tid lige nu, men prøv at se på disse hjemmesider:

http://j-walk.com/ss/excel/tips/tip83.htm
http://www.cathyastuce.com/vba/obj_xl_graph_series.php
Avatar billede sjap Praktikant
07. februar 2005 - 16:39 #5
Du kani øvrigt finde et tip mere her. Det er godt nok til addseries, men måske kan du bruge det alligevel.

http://peltiertech.com/Excel/ChartsHowTo/QuickChartVBA.html
Avatar billede bak Forsker
07. februar 2005 - 17:15 #6
Dan en streng først inden du sætter dine variable ind i grafen

Dim chrng As String
    chrng = "Drift1!$A$6;Drift1!$A$8:$A$400;Drift1!$H$6:$N$6;Drift1!$H$8:$N$400"
   
    ActiveChart.SetSourceData Source:=Sheets(vScrcSht(n)(1)).Range(chrng), PlotBy:=xlColumns
Avatar billede bak Forsker
07. februar 2005 - 17:46 #7
Skal du have projektoverskriften på grafen så definer den særskilt.

Dim chrng As String
chrng = "Drift1!$A$6;Drift1!$A$8:$A$400;Drift1!$H$6:$N$6;Drift1!$H$8:$N$400"
With ActiveChart
  .SetSourceData Source:=Sheets(vScrcSht(n)(1)).Range(chrng), PlotBy:=xlColumns
  .HasTitle = True
  .ChartTitle.Text = "=Drift1!" & Range("A6").Address(ReferenceStyle:=xlR1C1)

  With .Axes(xlCategory)
        .MinimumScale = lgDyNr(n)
        .MaximumScale = lgDyNr(n + 2)
  End With
End With
Avatar billede oyejo Nybegynder
08. februar 2005 - 07:21 #8
bak
antall rader og kolonner og hvilke kolonner varierer fra gang til gang. Jeg blir nødt til å angi sourceData ved hjelp av variabler.
Tror jeg må benytte union(Range(Cells(.. men er ikke sikker
Avatar billede bak Forsker
08. februar 2005 - 08:29 #9
Det er jeg godt klar over, oyejo, men byg strengen chrng op ved hjælp af variablerne istedet for at bruge variablerne direkte i SetSourceData.
Det vil gøre det nemmere at overskue og debugge om du har fået lavet strengen rigtigt.
Avatar billede oyejo Nybegynder
08. februar 2005 - 08:59 #10
bak
Det hadde jeg ikke tenkt på. God ide.
Radnummerene skal jeg nok greie, må nok tenke litt hardere for fikse
bokstavkombinasjoene i strengen.
Avatar billede bak Forsker
08. februar 2005 - 09:04 #11
Her er lidt at gå ud fra

Dim lRWoffst As Long
Dim aw As Worksheet
Set aw = ActiveSheet
lRWoffst = 6
a = 4
b = 5
lgLr = 23
st = aw.Cells(lRWoffst, 1).Address
st = st & "," & Range(aw.Cells(lRWoffst + 2, 1), aw.Cells(lgLr, 1)).Address
st = st & "," & Range(aw.Cells(lRWoffst, a), aw.Cells(lRWoffst, b)).Address
st = st & "," & Range(aw.Cells(lRWoffst + 2, a), aw.Cells(lgLr, b)).Address
Debug.Print st
With ActiveChart
  .SetSourceData Source:=Range(st), PlotBy:=xlColumns
  .HasTitle = True
  .ChartTitle.Text = "=Sheet2!" & Range("A6").Address(ReferenceStyle:=xlR1C1)

'  With .Axes(xlCategory)
'        .MinimumScale = lgDyNr(n)
'        .MaximumScale = lgDyNr(n + 2)
'  End With
End With
Avatar billede bak Forsker
08. februar 2005 - 09:04 #12
i dit tilfælde skal lgLr = 400
Avatar billede bak Forsker
08. februar 2005 - 09:08 #13
Du skal også lige ændre en linie
.ChartTitle.Text = "=" & aw.Name & "!" & aw.Range("A6").Address(ReferenceStyle:=xlR1C1)
Avatar billede oyejo Nybegynder
08. februar 2005 - 09:19 #14
bak, takker så mye så langt.
jeg trenger ettermiddagen til å finne ut av dette, tror det skal gå bra.
mulig jeg ikke får tid til å svare før i morgen tidlig.
oyejo
Avatar billede oyejo Nybegynder
08. februar 2005 - 13:04 #15
bak, takker og bukker ( lurer på hvor mangen ganger du har hjulpet meg nå :-)

Denne koden virker som den skal:
For n = 1 To 2
  lgLR = UBound(vTime(n)) + lRwOffst
  b = 1
  For i = 1 To UBound(vChrtFlw(n), 1)
    a = b + 1
    b = a - 1 + vChrtFlw(n)(i)
    Set aw = Workbooks(sTmpXls).Worksheets(vScrcSht(n)(1))
    st = vScrcSht(n)(1) & "!" & aw.Cells(lRwOffst, 1).Address
    st = st & "," & vScrcSht(n)(1) & "!" & Range(aw.Cells(lRwOffst + 2, 1), aw.Cells(lgLR, 1)).Address
    st = st & "," & vScrcSht(n)(1) & "!" & Range(aw.Cells(lRwOffst, a), aw.Cells(lRwOffst, b)).Address
    st = st & "," & vScrcSht(n)(1) & "!" & Range(aw.Cells(lRwOffst + 2, a), aw.Cells(lgLR, b)).Address
   
    MsgBox st
    '
    With Workbooks(sTmpXls).Charts(vChrtSht(n)(i))
      .SetSourceData Source:=Range(st), PlotBy:=xlColumns
      With .Axes(xlCategory)
        .MinimumScale = lgDyNr(n)
        .MaximumScale = lgDyNr(n + 2)
      End With
    End With
  Next
Next
Avatar billede oyejo Nybegynder
08. februar 2005 - 13:06 #16
men.. denne koden virker også!
det ble ikke nødvendig med aw ( tror jeg )
kan se ut som om address kun tar range og ikke sheet.
Send et svar så kommer velfortjente points!


For n = 1 To 2
  lgLR = UBound(vTime(n)) + lRwOffst
  b = 1
  For i = 1 To UBound(vChrtFlw(n), 1)
    a = b + 1
    b = a - 1 + vChrtFlw(n)(i)
    With Workbooks(sTmpXls).Worksheets(vScrcSht(n)(1))
        Set UnionRange = Union( _
        Range(.Cells(lRwOffst, 1), .Cells(lRwOffst, 1)), _
        Range(.Cells(lRwOffst + 2, 1), .Cells(lgLR, 1)), _
        Range(.Cells(lRwOffst, a), .Cells(lRwOffst, b)), _
        Range(.Cells(lRwOffst + 2, a), .Cells(lgLR, b)))
    End With
   
    With Workbooks(sTmpXls).Charts(vChrtSht(n)(i))
      .SetSourceData Source:=UnionRange
      With .Axes(xlCategory)
        .MinimumScale = lgDyNr(n)
        .MaximumScale = lgDyNr(n + 2)
      End With
    End With
  Next
Next
Avatar billede bak Forsker
08. februar 2005 - 13:07 #17
så får du lige et svar, oyejo :-)
Avatar billede oyejo Nybegynder
08. februar 2005 - 13:08 #18
den over ble feil, men den virker også, ;-)
her kommer den jeg kommer til å benytte.
For n = 1 To 2
  lgLR = UBound(vTime(n)) + lRwOffst
  b = 1
  For i = 1 To UBound(vChrtFlw(n), 1)
    a = b + 1
    b = a - 1 + vChrtFlw(n)(i)
    st = vScrcSht(n)(1) & "!" & Cells(lRwOffst, 1).Address
    st = st & "," & vScrcSht(n)(1) & "!" & Range(Cells(lRwOffst + 2, 1), Cells(lgLR, 1)).Address
    st = st & "," & vScrcSht(n)(1) & "!" & Range(Cells(lRwOffst, a), Cells(lRwOffst, b)).Address
    st = st & "," & vScrcSht(n)(1) & "!" & Range(Cells(lRwOffst + 2, a), Cells(lgLR, b)).Address
   
    MsgBox st
    '
    With Workbooks(sTmpXls).Charts(vChrtSht(n)(i))
      .SetSourceData Source:=Range(st), PlotBy:=xlColumns
      With .Axes(xlCategory)
        .MinimumScale = lgDyNr(n)
        .MaximumScale = lgDyNr(n + 2)
      End With
    End With
  Next
Next
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