Avatar billede knowman Juniormester
28. november 2003 - 17:07 Der er 10 kommentarer og
1 løsning

Fra værdier til binær matrice

I mit regneark har jeg 3 rækker med hver en værdi fra 1 til 27, i hver kolonne. Indholdet af disse 3 variabler for hvert individ er angivet i hver kolonne. F.eks:
F01    2    3    2
F02    4    7    7
F03    18    9    9

Jeg ønsker nu at konvertere dette til en binær matrice, hvor rækkerne angiver hver værdi i udfaldsrummet (dvs. 1..27), og der skal så sættes tre 1-taller i hver række, udfor hver værdi iht. ovenstående. I eksemplet herover skal der foreksempel sættes 1-taller i celle A2, A4 og A18, i B3, B7 og B9, samt i C2, C7 og C9:

1    1        1
2        1   
3    1       
4           
5           
6        1    1
7           
8        1    1
9           
10           
11           
12           
13           
14           
15           
16           
17    1       
18           
19           
20           
21           
22           
23           
24           
25           
26           
27

Hvordan gør jeg det smartest i Excel?

Bonusspørgsmål (hm, kan man egentlig give ekstra point her?): Det vil være endnu bedre hvis udfaldsrummet kunne være vilkårligt og at A-kolonnen indeholder elementerne i udfaldsrummet, og at den så stadig selv kunne finde ud af at placere 1-tallerne de rigtige steder i forhold til værdierne i A-kolonnen. Men det er nok en tand for kompliceret?
Avatar billede knowman Juniormester
28. november 2003 - 17:08 #1
Bemærk at rækkerne i eksemplet ovenfor har rykket sig en tak i eksemplet, så det er ikke vist helt korrekt, men jeg håber at det alligevel viser hvor jeg vil hen...
Avatar billede overchord Nybegynder
28. november 2003 - 17:19 #2
Jeg har lagt dine tre raekker i sheet 1 mens matricen laves i sheet 2 (der er ingen begraensning paa om der er vaerdier hoereje end 27 eller ej.

Sub testbinary()
Sheet1.Select
For i = 1 To 3
x = Range("b" & i)
Sheet2.Range("a" & x) = 1
x = Range("c" & i)
Sheet2.Range("b" & x) = 1
x = Range("d" & i)
Sheet2.Range("c" & x) = 1



Next i

End Sub
Avatar billede knowman Juniormester
28. november 2003 - 18:05 #3
Yes, den gør det sgu! Men i praksis har jeg jo altså flere kolonner (ellers ville det være let nok at gøre det i hånden), og så skal jeg have 2 nye linjer i scriptet for hver eneste kolonne? Og så er jeg jo næsten lige vidt - at jeg lige så godt kunne gøre det manuelt? Kan det ikke automatiseres yderligere?
Avatar billede bak Forsker
28. november 2003 - 19:55 #4
Så prøv den her

Sub BinaryMatrix()
Dim start As Long, slut As Long, y As Long, x As Long
Dim rng As Range, Output As Range, c As Range
Dim temp()
'************* U S E R  I N P U T *********************
start = Application.InputBox("Lower limit")
slut = Application.InputBox("Upper limit")
Set rng = Application.InputBox("Input Area (only numbers)", , , , , , , 8)
Set Output = Application.InputBox("First Output Cell", , , , , , , 8)
'*******************************************************

ReDim temp(start To slut, rng.Rows.Count + 1)
'**** Fyld array med udfaldsrummets tal ****************
For y = start To slut
    temp(y, 0) = y
Next
'**** Lav den binære matrice ***************************
For Each c In rng
    For x = start To slut
      If c.Value = x Then
        temp(x, c.Column - rng.Column + 1) = 1
        Exit For
      End If
    Next
Next
'**** Fyld celler med matricen *************************
Output.Resize(slut - start + 1, rng.Rows.Count + 1) = temp
End Sub
Avatar billede bak Forsker
28. november 2003 - 21:20 #5
sidste linie skulle have været:
Output.Resize(slut - start + 1, rng.Columns.Count + 1) = temp
Avatar billede bak Forsker
28. november 2003 - 21:43 #6
Sorry, jeg lavede samme fejl lidt længere oppe. du får lige hele koden igen.

Sub BinaryMatrix()
Dim Start As Long, Slut As Long, y As Long, x As Long
Dim rng As Range, Output As Range, c As Range
Dim temp()

'************* U S E R  I N P U T *********************
Start = Application.InputBox("Lower limit")
Slut = Application.InputBox("Upper limit")
Set rng = Application.InputBox("Input Area", , , , , , , 8)
Set Output = Application.InputBox("First Output Cell", , , , , , , 8)
'*******************************************************

ReDim temp(Start To Slut, rng.Columns.Count + 1)

'**** Fyld array med udfaldsrummets tal ****************
For y = Start To Slut
    temp(y, 0) = y
Next

'**** Lav den binære matrice ***************************
For Each c In rng
    For x = Start To Slut
      If c.Value = x Then
        temp(x, c.Column - rng.Column + 1) = 1
        Exit For
      End If
    Next
Next

'**** Fyld celler med matricen *************************
Output.Resize(Slut - Start + 1, rng.Columns.Count + 1) = temp

End Sub
Avatar billede bak Forsker
29. november 2003 - 15:33 #7
Avatar billede bak Forsker
04. december 2003 - 15:58 #8
Knowman - > har du testet ?
Avatar billede knowman Juniormester
15. december 2003 - 16:33 #9
Hej Bak
Undskyld, jeg har været syg, og så har der været konference. Nu er jeg tilbage på min pind og vil kigge på det. Det er mere kompliceret end jeg havde forestillet mig, jeg troede faktisk ikke at man skulle i gang med makroprogrammering. Nå, jeg kigger på det og vender tilbage.
Mvh peter.
Avatar billede bak Forsker
22. december 2003 - 20:37 #10
peter, funker det ?
Avatar billede knowman Juniormester
01. januar 2004 - 20:54 #11
Hej Bak
Jeg beklager at jeg har været så længe om det. Det ser ud til at virke. Så jeg har accepteret svaret. Tak for hjælpen, og godt nytår!
Mvh Peter.
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