Avatar billede vestre Nybegynder
03. april 2008 - 18:20 Der er 24 kommentarer og
1 løsning

Spørgsmål til Array, Range og Variant

Hej eksperter

Jeg har to spørgsmål til jer

1:

Dim MyArray(0 To 1000) As Variant
 
While Cells(1, i).Value > 0                                                               
  MyArray(i) = Cells(1, i).Value
  i = i + 1
Wend

Nu vil jeg gerne skrive "MyArray" i kolonne A og jeg bruger:
 
While Cells(1, j).Value > 0
  Cells(j, 1).Value = MyArray(j)
  j = j + 1
Wend

Men med 1000 eller flere tal så tager det noget tid! Jeg har leget lidt med:

  Range("A1:A1000") = Application.Transpose(MyArray)

Men jeg kan ikke få det til at fungere. Hvad gør jeg galt?

---------------

2:

Der skal skæres hhv 20, 25 og 15 rør af længderne 100, 120 og 150 fra et stort rør som er 1000.

Dim DemLen(100, 120, 150) As Variant
Dim Demand(20, 25, 15) As Variant
Dim Prod(0, 0, 0) As Variant

MaxLen = 100
i = 0
j = 0

While Prod(j) <= Demand(j)
  If Prod(j) >= Demand(j) Then
      j = j + 1
  End If                                                               
  While DemLen(i) <= MaxLen And DemLen(i) > 0                                                 
      If Prod(i) < Demand(i) Then
        Prod(i) = Prod(i) + 1
        Cells(j, i).Value = Cells(j, i).Value + 1
        MaxLen = MaxLen - DemLen(i)
      ElseIf MaxLen > DemLen(i) Then                                                                 
        i = i + 1                                                                                     
      ElseIf Demand(i) - Prod(i) = 0 Then                                                           
        i = i + 1                                                                                     
      End If                                                                                 
  Wend
Wend

Det fungerer egentligt som det skal, men følgende linje gør det hele ret langsomt:

  Cells(j, i).Value = Cells(j, i).Value + 1

Er der en måde hvorpå jeg kan opsamle dete hele i en tabel og så skrive det hele til sidst vha

  Range("A1:C3")=[et eller andet smart]

Det jeg mangler er egentlig en tabel hvor jeg kan hente tallene ud vha række og kolonnenummer.

Håber i kan hjælpe.
Avatar billede kabbak Professor
03. april 2008 - 18:24 #1
1.
Dim MyArray As Variant

MyArray  = Range("A1:A1000")
Avatar billede vestre Nybegynder
03. april 2008 - 18:25 #2
Lige en lille typo: MaxLen = 1000

:-)
Avatar billede kabbak Professor
03. april 2008 - 18:26 #3
2. gem det i en variabel

Dim Minvar as integer
minvar = minvar + 1

Cells(j, i).Value = Cells(j, i).Value + 1
Avatar billede vestre Nybegynder
03. april 2008 - 18:40 #4
@ 1:
Hvordan kan jeg så få fat i et tal fra MyArray?

MyArray(i) siger:
Run-time error '9'
Subscript out of range
Avatar billede vestre Nybegynder
03. april 2008 - 18:47 #5
@ 2:

Den laver et møster som her:

    A  B  C
1    6      1
2    6      1
3    3  4 
4        8
5        8
6        5  4
7          10
8            4

Men den gør det ved at sætte A1 til 1, så 2, så 3 osv og skrive det hele i excel på samme tid. Hvordan kan jeg gemme tallet i en tabel?

Jeg kan lave en Array til hver række og så gemme minvar der, men i nogle tilfælde når jeg op over 1000 rækker, hvorfor det ikke synes særligt tiltalende :-P
Avatar billede kabbak Professor
03. april 2008 - 18:49 #6
MyArray(i,1)

I = rækken i variablen, 1 = kolonne 1 i variablen
Da vi kun indlæser A kolonnen er der kun 1 kolonne
Avatar billede kabbak Professor
03. april 2008 - 18:55 #7
Jeg forstår ikke det fra punkt 2, er det ikke den A kolonne du bruger i punkt 1 ?
Vil du så skrive i den igen ??
Avatar billede vestre Nybegynder
03. april 2008 - 18:56 #8
Arh okay perfekt. Kan ikke lige teste det nu da jeg skal have ændret en del MyArray(0,x) til MyArray(1,x) efter det her inden det kører.
Avatar billede vestre Nybegynder
03. april 2008 - 18:57 #9
Nej punkt 2 har ikke noget med punkt 1 at gøre. Beklager hvis jeg ikke lige fik det gjort klart.
Avatar billede kabbak Professor
03. april 2008 - 18:58 #10
Ikke
MyArray(0,x) til MyArray(1,x)

men

MyArray(0,x) til MyArray(X,1)
Avatar billede vestre Nybegynder
03. april 2008 - 20:16 #11
Så kom jeg på rette vej igen. Tusind tak kabbak. Smid et svar så du kan få point.

Lige en sidste ting

Jeg har:
Dim MyArray As Variant
Dim Int As Integer

Når jeg prøver
 
  MyArray(1, j) = Int

Så får jeg: Run-time error '13' Type mismatch
Hvordan sætter jeg række 1, kolonne j til at være lig med Int?
Avatar billede vestre Nybegynder
03. april 2008 - 20:47 #12
Jeg opdaterer lige spørgsmålet:

Dim MyArray(1 to 100) As Integer
Dim Int As Integer

MyArray(1, j) = Int

Range("A1:A100") = Application.Transpose(MyArray)

Så får jeg: Run-time error '13' Type mismatch
Avatar billede kabbak Professor
03. april 2008 - 21:45 #13
Send lige arket, så ser jeg på det
kabbak snabela tiscali dot dk
Avatar billede kabbak Professor
03. april 2008 - 21:53 #14
Du skal være klar over at når man gør således

Dim MyArray As Variant
MyArray  = Range("A1:A1000")


Og  A1 = 1, A2 = 10, A3 = 20 og A4 = 121

så ligger data sådan
MyArray(1,1) = 1
MyArray(2,1) = 10
MyArray(3,1) = 20
MyArray(4,1) = 120
o.s.v.
Avatar billede vestre Nybegynder
03. april 2008 - 22:10 #15
Jeg har smidt en mail afsted
Avatar billede kabbak Professor
03. april 2008 - 22:11 #16
jeg kikker på den nu
Avatar billede kabbak Professor
03. april 2008 - 23:59 #17
her er koden jeg kom frem til:


Private Sub CommandButton1_Click()

    Dim MaxLen, I, X As Integer
    Dim DLW As Integer, TPC As Integer, Antal() As Integer
    DLW = Range("C4").End(xlToRight).Column - 2    ' finder antal forskellige længder, bruger den også til at finde antal stk.
    ReDim Antal(DLW)
    TPC = [C10]
    MaxLen = Cells(2, 3).Value
    Dim DemLen As Variant
    Dim Demand As Variant
    Dim Waste_And_Prod As Variant
    Range("C19:X60500,C7:W7,c10").ClearContents    'emty cells
    Waste_And_Prod = Range(Cells(19, 3), Cells(19 + TPC, 3 + DLW))


    DemLen = Range(Cells(4, 3), Cells(4, DLW + 2))    'DemLen = Range("C4:IV4")
    Demand = Range(Cells(5, 3), Cells(5, DLW + 2))    'Demand = Range("C5:IV5")

    If MaxLen < Application.WorksheetFunction.Max(DemLen) Then        'Check if pipes are long enough
        MsgBox ("Demanded length(s) may not exceed the length of the pipe!")
        End
    End If
    For X = 1 To TPC    ' antal længder
        For I = 1 To DLW    ' antal forskellige stykker
            Do Until DemLen(1, I) >= MaxLen
                If Antal(I - 1) >= Demand(1, I) Then Exit Do    ' dropper ud hvis antallet er nået
                Waste_And_Prod(X, I + 1) = Waste_And_Prod(X, 1 + I) + 1    ' skriver at der er lavet 1 eller flere
                MaxLen = MaxLen - DemLen(1, I)    ' holder styr på resten af længden
                Antal(I - 1) = Antal(I - 1) + 1    ' tæller antallet af stykker
                Waste_And_Prod(X, 1) = MaxLen    ' gemmer spildet "Waste"
                DoEvents
            Loop

        Next I
        MaxLen = Cells(2, 3).Value
    Next X

    Range(Cells(19, 3), Cells(19 + TPC, 3 + DLW)) = Waste_And_Prod    ' skriver til cellerne


End Sub

Private Sub CommandButton2_Click()
    Range("C2,C4:W5,C19:X60500,C7:W7,C10").ClearContents
End Sub
Avatar billede kabbak Professor
04. april 2008 - 00:02 #18
lav lige

Do Until DemLen(1, I) >= MaxLen
om til
Do Until DemLen(1, I) > MaxLen
Avatar billede kabbak Professor
04. april 2008 - 00:09 #19
ret
Range("C19:X60500,C7:W7,c10").ClearContents    'emty cells
til
Range("C19:X60500,C7:W7").ClearContents    'emty cells
Avatar billede kabbak Professor
04. april 2008 - 00:12 #20
et svar ;-))
Avatar billede vestre Nybegynder
04. april 2008 - 01:07 #21
Det kører næsten som en drøm...

TPC er ikke givet på forhånd, men skal findes gennem ovenstående.

TPC kan dog findes ved MAX(B19:B60000), så jeg har fjernet TPC og i stedet:

Dim X As Long
Waste_And_Prod = Range(Cells(19, 3), Cells(19 + 60000, 3 + DLW))

For X = 1 To 100000

Range(Cells(19, 3), Cells(19 + 60000, 3 + DLW)) = Waste_And_Prod

Og så kører det.

og skal det ikke være: Do Until DemLen(1, I) >= MaxLen?
Hvis DemLen(i,I) = MaxLen er der lige netop plads til en mere jo :)

Men jeg siger tusinde tak for hjælpen... det er lidt mere elegant, for ikke at sige hurtigere(!), end min løsning.
Avatar billede vestre Nybegynder
04. april 2008 - 01:09 #22
og nej det skal være Do Until DemLen(1, I) > MaxLen :-P
Avatar billede kabbak Professor
04. april 2008 - 08:54 #23
Hvad med det, der går fra til savespor, på en længde på 1 meter, kan du ikke få 2 på 50 cm, da der går et savespor fra, på ca. 2 til 3 mm.

det burde man faktisk trække fra maxlen, når der saves
savespor = 0.03

MaxLen = MaxLen - (DemLen(1, I)+ savespor)    ' holder styr på resten af længden
Avatar billede kabbak Professor
04. april 2008 - 08:56 #24
så skal MaxLen jo også være af typen Double

Dim MaxLen as double, I, X As Integer
Avatar billede vestre Nybegynder
04. april 2008 - 13:22 #25
Helt korrekt, men det har jeg antaget mig ud af.

Som du selv gør opmærksom på, så er det nemt at implementere, hvis modellen skal gøres klar til brug IRL.

Derudover kunne der laves en række features der ville gøre modellen mere brugervenlig.

Eksempelvis at den sorterer DemLen aftagende, hvis brugeren ikke selv indtaster dem aftagende. Ligeledes hvis brugeren indtaster samme DemLen to gange, så trækkes de automatisk sammen i én celle.

Hvis modellen skulle være brugbar skulle den også generere en udskriftsvenlig produktionsplan
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
Kurser inden for grundlæggende programmering

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