Just nu i M3-nätverket
Gå till innehåll
Locutus

Värde från makroskapat excelblad, hänvisning till rätt blad

Rekommendera Poster

Postad (redigerade)

Hej.

Jag har ett Excelmakro, där jag gjort nya blad och namngivit dem och behöver lägga information på "rätt" blad i vba-koden.

Tanken är att jag ska söka igenom Exceldokumentet som makrot skrivits i och om det står "x" i en ruta, då ska information hämtas från ett annat blad (den excelbok som var aktivt när makrot startats).

Bifogad bild 1 visar hur Exceldokumentet ser ut.

Följande kod har fungerat för att skapa nya blad i den nya excelboken, men jag får problem att hämta ut informationen. Får en körkod "9", "Indexet är utanför intervallet"

Set wkb357 = Excel.Workbooks("Makro_Till_ELVIS_listor_AllaAvd_v11_180405.xlsm")
Set wks1 = wkb357.Worksheets("357")

ElseIf var_avd = "357" Then

    Set NewSheet = Worksheets.Add
    NewSheet.name = wks1.Range("A2")
    Set NewSheet = Worksheets.Add
    NewSheet.name = wks1.Range("F2")
    Set NewSheet = Worksheets.Add
    NewSheet.name = wks1.Range("L2")
    Set NewSheet = Worksheets.Add
    NewSheet.name = wks1.Range("R2")
    Set NewSheet = Worksheets.Add
    NewSheet.name = wks1.Range("X2")
    Set NewSheet = Worksheets.Add
    NewSheet.name = wks1.Range("AD2")

Sidan som informationen ska hämtas från om det står "x" på en viss rad, ser ut som bifogad bild 2

Makrot ska då hämta ut informationen från hela den raden (8 celler) och skriva till rätt blad, som heter samma som värdet i A2

Det är där det strular, jag får ingen information när jag försöker hämta ut värden med följande kod och jag tror jag har gjort det mer komplicerat än det behöver vara och hänvisar på fel sätt. Skulle behöva hänvisa till ett Worksheet med det namn som makrot har skapat i koden ovan, det gruppnamnet är samma som finns på sidan som söks igenom. När jag stegar igenom och kör koden, kommer den inte ens in i looparna.

Set wkb357 = Excel.Workbooks("Makro_Till_ELVIS_listor_AllaAvd_v11_180405.xlsm")
Set wks1 = wkb357.Worksheets("357")

Dim Int_xx ' *** Variabel för rum 1-19 på admin-sidan ***
Dim Int_bed ' *** Variabel för sängplats 1-5 på admin-sidan ***
Dim Int_Case ' *** Variabel för rum 1-19 på makro-sidan ***
Dim var_sheetName ' *** Variabel för namnet på fliken (Gruppnamn) i makrot ***

Int_xx = 3
    ' *** Gå igenom alla rum (1-19) och placera ut på resp lista och grupp ***
Select Case Array_Avdlista(Int_currRow, var_counter)
    For Int_Case = 1 To 19
		For var_step = 1 to 49 step 7
			' *** Gör så länge det står något i Gruppnamn-cellen på admin-sidan ***
			Do While wks.Range(var_step,2) <> ""
				' *** Iterera igenom admin-sidans lista över sängplatser *** 
				' *** Om rumsnummer på admin-sidan matchar Aktuellt rum som ska skrivas ***
				If wks.Range(var_step, Int_xx).Value = Int_Case Then
					'  *** Iterera igenom admin-sidans rumsrad och se vilka det står "x" på och ta med dem på listan ***
					For Int_bed = 0 To 4
						If wks.Range(var_step + 1, Int_xx + Int_bed).Value = "x" Then
							' *** Lägg till alla cellers info i aktuell grupp ***
							For d = 1 To 8
								var_sheetName = wks.Range(var_step, 2).Value
								Sheets(var_sheetName).Cells(1, d).Value = Array_Avdlista(Int_currRow, d)
							Next d
						End If
					Next Int_bed
				End If
				' *** Gå till nästa rad med rumsnummer på admin-sidan och loopa ***
				Int_xx = Int_xx + 1
			Loop
		Next var_step
		Int_Case = Int_Case + 1
	Next Int_Case
End Select

 

 

EXCEL_2018-04-14_05-44-40.png

EXCEL_2018-04-14_06-25-14.png

Redigerad av Locutus

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Kör kod 9 är en klassiker som är svår att veta vad den beror på. Ibland kan den tillochmed försvinna helt, och allt fungera, om man stegar genom koden.

Det är lite för mycket kod för att enkelt kunna sätta sig in i den.

 

Skulle nog säga att du skulle ha en del på att vinna i att bryta upp koden i flera procedurer. En som tar exakt och enbart som invärde blad att kopiera från, blad att kopiera till och celler. Inget mer.

Dvs kod som du enkelt kan testa med en annan rutin.

Missa inte heller att använda DBEUG.Print som kan skriva ut valda värden i direktfönstret. Effektivt när man ska debugga för att se vad man har.

 

Men som sagt, dela upp i subrutiner, se att varje del funderar för sig.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Tack för svaret, jag antar att jag får strukturera om allting, som du säger.

En par mer specifika frågor:

 

1. Vad är bästa sättet att hämta ut ett värde från ett excelblad som skapats via VBA-kod? Hur kan jag lägga namnet från Newsheet.Name i en variabel och hänvisa till det? Bladet får ju ett namn "Bladx" (som är okänt) och också det namn jag ger det med Newsheet.Name.

2. Jag skulle helst vilja hämta information med tal-koordinater, inte ex "A2". Hur gör jag det på bästa sätt, gruppnamnen ligger ju på var 6:e cell alltid på samma rad?

3. Hur aktiverar jag "direktfönstret"?

 

Tack

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

1: Arbetsblad tar du enklast en referens till Worksheets("namnet") . Annars eftersom du har referens till alla blad kan du lägga dem i kollektion, en lista eller liknande.

Sub test()
    Dim mySheets As New Collection
    Dim ws As Worksheet
    mySheets.Add Worksheets("blad1")
    mySheets.Add Worksheets("blad2")
    mySheets.Add Blad3
    For Each ws In mySheets
        Debug.Print ws.Name
    Next ws
End Sub

2: ws.cells(rwIndex, clIndex)

exempelvis

3: ctrl+g i VBA-editorn eller menyn Visa -> direktfönster.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...