Just nu i M3-nätverket
Jump to content

Välja Active workbook på smart sätt


Tok-Torsten

Recommended Posts

Hej igen,

det går sakta framåt med mina små script. Länkningen har ju blivit riktigt bra. Och jag både skapar upp mappstrukturer för mina användare och kan hämta upp en hel grupp med filer på ett snyggt sätt.

Dvs användaren öppnar alla filer i en mapp för att konvertera dess innehåll till textfiler mha ett macro.

 

När jag har kört det själv så har jag efter att konverteringen gjorts stängt ned den fil jag just bearbetat och sedan gjort om samma sak med nästa fil. Nu tänkte jag bättra på användargränssnittet så att macrot i slutet stänger ned den activa filen utan att spara förändringarna.

 

'Stäng ned Excelfilen som skapat test-fil

ActiveWindow.Close Savechanges:=False

 

Resultatet blir att den activa filen stängs ned men att därefter hamnar jag varje gång i den excelfil som macrot ursprungligen skapats i. Även om denna fil inte är öppen så öppnas den. (Jag kör mina macron via en meny jag skapat).

 

Det önskade resultatet skulle vara att nästa öppna blad blir det nya aktiva.

 

Hej, Torsten

 

Link to comment
Share on other sites

Öppnar du boken via kod?

 

Se då till att sätta en referens till denna bok när du öppnar den:

 

Dim wbWork As Workbook

Sub MyOpen()
   Set wbWork = Workbooks.Open("bok1.xlsm")
   wbWork.Parent.Visible = False

End Sub

Sub myClose()
   If Not wbWork Is Nothing Then wbWork.Close SaveChanges:=False
End Sub

med en liten bonus som döljer boken du öppnat...

 

Active, select och liknande anrop ska man helst undvika då de som du märker kan peka helt galet.

 

Du kan även adressera böcker med namn i stil med

If  Not WorkBooks("Bok1.xls") is Nothing Then WorkBooks("Bok1.xls") SaveChanges:=False

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Hej igen,

jag förstår inte riktigt allt i ditt svar.

Ja jag oppnar via kod. Använder mig av

Set fdOpen = Application.FileDialog(msoFileDialogOpen)

With fdOpen

etc....

 

Vad jag skulle vilja vore att få upp nästa fil som ligger i listan under Window. Så fungerar det om jag klickar på krysset men jag skulle vilja undvika detta för om jag klickar på krysset så måste jag klicka vidare på save/no save etc..

 

 

Jag vill öppna samtliga filer i en katalog, kunna se dem i excel, innan jag processar dem.

Sedan vill jag avsluta min process med att skriva en konverterad fil med att stänga filen och då stå i nästa öppnade fil.

 

Ditt kodförslag är väl mer lämpat för en fil?? Som sagt jag förstår den inte riktigt.

 

 

Hej, Torsten

 

Link to comment
Share on other sites

Okej, tror jag greppar det.

 

Jag skulle nog göra som

1: Låta användaren peka ut vilka filer som ska bearbetas.

2: Lagra dessa i en lista.

3: ta första fil i listan, öppna denna, visa denna.

4: Användaren klickar sedan antingen på konvertera eller avbryt för denna fil.

5: I koden har du då valet att från punkt tre antingen spara namnet på boken du öppnat eller spara en referens. Du använder vilket som för att adressera och stänga boken.

6: Koden loopar tillbaka till steg 3 men tar då nästa fil i ordningen.

 

Finns dock ett problem, loopen havererar om användaren stänger filen. Kanske bättre då.

3: Öppna alla filerna.

4: Låt användaren välja fil att bearbeta, koden stänger denna efter bearbetning (referens skapas lämpligen då användaren väljer bok att bearbeta)

5: Koden gör en Select/Activate på nästa bok i ordning.

 

typ...

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Passar på medan tråden är varm.

Hur gör jag en select/Activate

Skriver jag bara detta och så kommer jag till en valmeny eller?

 

Jag har varit inne på ditt första förslag men mina programmeringskunskaper innefattar inte skapa lista. Var lagras en sådan? Men finns det problem så låter ju det andra alternativet bättre.

 

Hej, torsten

 

Link to comment
Share on other sites

Hej igen,

har sökt runt och det jag skulle vilja göra vore kanske att öppna exceldialogen Window.

 

På motsvarande sätt som nedanstående kommando öppnar Open dialogen.

 

Application.Dialogs(xlDialogOpen).Show

 

Jag har givetvis försökt mig på att skriva

 

Application.Dialogs(xlDialogWindow).Show vilket inte ger något fel till dess att jag försöker köra koden.

 

Hej, Torsten

 

Link to comment
Share on other sites

Workbooks("Bok1.xlsm").Activate

aktiverar den arbetsboken givet att den är laddad.

 

Listor?

Finns flera sätt. Man kan skapa en array med strängar där filnamnen lagras. Där måste man dock hålla reda på storleken på arrayen men det är inte så svårt.

 

Enklast kanske är följande som dock är lite i högre skolan, att använda en dynamisk samling.

 

men ett array-exempel:

Sub arrayExempel()
   Dim myRn As Range
   Set myRn = Blad1.Range("a1:A10")

   Dim myStr() As String
   ReDim myStr(myRn.Cells.Count - 1)

   Dim i As Integer
   For i = 0 To UBound(myStr)
       myStr(i) = myRn.Cells(i + 1, 1)
   Next i

   For i = 0 To UBound(myStr)
       myRn.Cells(i + 1, 2) = myStr(i)
   Next i

End Sub

 

 

Eller en generisk samling (Collection)

Sub CollectionExempel()
   Dim myColl As New Collection

   Dim myRn As Range
   Set myRn = Blad1.Range("a1:A10")
   Dim myCell As Range
   For Each myCell In myRn
       myColl.Add myCell
   Next myCell

   Dim vr As Variant
   Dim i As Integer
   i = 1
   For Each vr In myColl
       myRn.Cells(i, 2) = vr
       i = i + 1
   Next vr

End Sub

 

Måste medge, collection är ny för mig.... Använt Dictionary förr men inte collection.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Excel-dialogen? Vilken dialog?

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Aj då, det kanske inte heter dialog. Mitt försvar är att jag är Generalist och Metodutvecklare och inte egentligen gör anspråk på at vara programmerare.

Det jag är ute efter är att med kommandot.

Application.Dialogs(xlDialogOpen).Show

Så kan jag från ett VBA script få mitt macro att göra motsvarande som klickningarna, File/Open/ inne i excel gör. Dvs användaren kommer att få upp denna ruta då macrot körs.

 

Så min fråga är om det finns något kommando i VBA som kan öppna motsvarande meny/drilldown som ligger under Window. Där skulle i så fall mina användare kunna välja vilken fil de vill ha som active workbook.

 

Hej, Torsten

 

Link to comment
Share on other sites

Nu är det lite oklart vad du menar. kanske. jag chanser

 

Du vill inte öppna dialogen, du vill "emulera" den och därmed spara rätt fil och gå vidare med nästa?

 

Det torde inte vara så svårt att veta vilken bok du vill stänga, vilken bok du vill spara och vilken du öppna härnäst. Om du inte vet vilken bok du arbetar med är du illa ute från start!

 

Jag har beskrivit lite tekniker för hur man kan adressera böcker, räcker inte dessa?

 

En liten grund i hur du bör tänka så kanske det hela klarnar. Du skriver att du inte är en programmerare så detta skadar nog inte.

 

1: Tänk dig att varje procedur du skapar är atomär. Den gör en sak och den gör det jekligt bra.

2: För att skapa första proceduren måste inte andra vara klar, skapa dummies som du anropar men som inte gör något med filen egentligen. Bygg upp ett ramverk med alla procedurer som behövs och testa/bygg ut del för del.

 

I detta fallet

1: ha en procedur vars enda uppgift är att stega igenom och hålla reda på filer.

2: Denna kan ta som inargument en lista med de filer som ska gås igenom

3: Den stegar igenom, anropar de procedurer som ska arbeta med den, får till slut tillbaka en ny arbetsbok som ska sparas.

4: Den går igenom alla böcker i listan, sparar ned/stänger dem efterhand.

 

 

Typ.

Sedan till detta kommer problemet med användarens interaktion men jag vet ju inte riktigt vad du gör egentligen så jag kan inget säga om det.

 

Exempel på koden du har problem med kan göra det enklare att hjälpa.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...