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

Excel 2010, radera utvalda kolumner med vba

Rekommendera Poster

Hej,

 

Jag vill markera 1 eller flera celler (oavsett rader), i en eller flera olika kolumner, och sedan via vba radera just de kolumner som innehåller markerade cell/er.

Hur får jag koden att känna av att det är minst 1 cell markerad i en kolumn?

 

Problemet är att jag måste ju börja med att ta bort kolumnen med högsta kolumnsiffran och gå neråt, annars tas inte alla "cellmarkerade" kolumner bort (eftersom de flyttas åt vänster för varje som raderas).

 

 

Hur skriver jag detta i vba?

 

 

/speedy1

 

 

Dela detta inlägg


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

Varför VBA?

Klicka cell 1

håll nere ctrl

klicka cell 2, 3, 4, 5 osv

högerklicka, välja ta bort, hela kolumnen. 

 

Klart och kräver inte fler klick än vad ett makro skulle kräva.

 

Om du vill göra det via VBA får du, som du märker, stega från yttersta kolumn och inåt.

Dela detta inlägg


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

Jag vill göra det med VBA bara "för att" (man säkert kan göra det). :)

 

Som sagt, det knepiga är att definiera kolumner med en cell/flera celler markerade och att kunna börja radera den kolumn med högst kolumnnummer och fortsätta neråt.

 

Någon som vet hur jag skriver det i kod?

Dela detta inlägg


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

Du behöver kika lite på mängdobjektet Areas och dess egenskaper för Areas.Count resp. Areas.Item. Lite exempelkod som ger dig en hint om vägen fram:

Sub VisaAreaEgenskaper()
    
    Dim iAreaCount As Integer
    Dim i As Integer

    Worksheets("Blad1").Activate
    iAreaCount = Selection.Areas.Count

    If iAreaCount <= 1 Then
        
        MsgBox "Markerat område innehåller " & Selection.Columns.Count & " kolumner."
    
    Else
        
        For i = 1 To iAreaCount
            
            MsgBox "Område " & i & " i markeringen innehåller " & _
             Selection.Areas(i).Columns.Count & " kolumner."
            
            MsgBox "Första cellens position i markerat område " & i & _
             " Rad: " & Selection.Areas.Item(i).Row & " -- Kolumn: " & _
             Selection.Areas.Item(i).Column
            
        Next i
    
    End If

End Sub

Jag kan tänka mig följande arbetsgång;  att du läser av markerade områden och sparar positionerna i en matris och därifrån tar ut kolumner "längs till höger" först för radering och jobbar dig mot "vänster".

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)
Sub raderaKolumnerMedMarkeradCell()
    
'radera resp kolumner som har minst 1 cell markerad
    
    Dim iAreaCount As Integer
    Dim i As Integer

Application.ScreenUpdating = False


    Worksheets("Blad1").Activate
    iAreaCount = Selection.Areas.Count
    
        If iAreaCount <= 1 Then
            ActiveCell.EntireColumn.Delete
        
        Else
            For i = iAreaCount To 1 Step -1
                Selection.Areas.Item(i).EntireColumn.Delete
            Next i
            
        End If


    ActiveCell.Select

Application.ScreenUpdating = True
End Sub

Tack Ove, för hjälpen. Det här är vad jag åstadkommit, som verkar fungera - raderar från sista till första kolumnen.

(Koden fungerar om jag markera från LÄGSTA kolumn till HÖGSTA, inte om jag markerar i annan ordning, hm)

Läsa in i matris har jag lite svårt att förstå ...

 

Areas, Areas.Count resp Areas.Item har ag nog aldrig använt tidigare, men det var ett smart sätt.

Finns det övrig info jag klan få om detta?

 

 

(Koden fick jag in till slut men det fungerar inte att klistra in kopierad text i denna svarsruta, vad gör jag för fel?!)

Redigerad av speedy1

Dela detta inlägg


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

1. När det gäller referensinformation om t.ex. syntax, objekt, metoder osv så är VBA hjälpen första stället att leta i - VBA-editorn - Hjälp - Hjälp om Microsoft Visual Basic for Applications (Excel 2010 i mitt fall). Det finns även bra resurser online, t.ex. Welcome to the Excel 2010 Developer Reference (MSDN / microsoft.com). För info om just Areas: https://msdn.microsoft.com/en-us/library/office/ff821504(v=office.14).aspx .

 

2. När jag klistrar in kod så klickar jag först på knappen <> i inläggseditorns verktygsrad. Du får upp en ny dialogruta, välj först "Typ av kod" till None och klistra därefter in Excelkoden.

Dela detta inlägg


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

Jag tolkar det som att mitt förslag på kod var ok ... :)

 

1. Tack för länkar med info. De ska jag kolla på.

 

2. Koden fick jag in på det sätt du beskriver, men vanlig text som jag skrivit i annat program klistras inte in med knapparna som finns här, och inte heller med högerklick Klistra In. Fattar inte varför.

Dela detta inlägg


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

Använd gärna Testhörnan i subforat Eforum för att testa dig fram till rätt handhavande. Återkoppla i Buggrapporter och önskemål om Eforum om du upptäcker något fel alternativt PM:ar någon av moderatorerna.

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



  • Liknande Innehåll

    • Av MvS
      Hej i forumet!
      Har tidigare ropat på hjälp med funktionen "mail-merge" i Excel men själv lyckats lösa de problemen. Det problem jag nu adresserar forumet med verkar lite knepigare och jag behöver få hjälp om det finns någon annan som har haft liknande problem och löst det.
      BAKGRUND:
      Har en databas jag gjort i Excel där jag behöver kunna skriva ut etiketter i en Word-mall som jag anropar med mail-merge i ett VBA makro. Både Excel-filen och Word mallen ligger i en mapp centralt på en nätverksplats. Excel-filen är utformad så att den sparas automatiskt på nätverket men också med en kopia lokalt på användarens HD. Meningen är att man ska arbeta på den lokala kopian och att den sedan uppdaterar på nätverket. Detta för att säkerställa att arbetsboken inte blockeras av en användare samt att det ska gå att jobba med databasen även i utrymmen där det inte finns WiFi.
      Det innebär alltså att man ska kunna anropa Word-dokumentet från BÅDE filen på nätverket OCH från den lokala kopian vid behov, varför sökvägarna måste vara relativa. 
      PROBLEMET:
      När jag kör koden och kommer till själva mail-merge sekvensen ger Excel felsvar att strängen innehåller fler än 255 tecken! Varför sker detta?  Har testat både att ha alla mail-merge argument utskrivna i sekvensen samt, som i detta fall, att ange argumenten i variabler ─ utan framgång!
       

       
      Har sökt med ljus och lykta efter svar på webben men det verkar inte som någon har ett bra svar att ge hur man kan komma runt detta problem! Skulle det kunna lösas med en systemfunktion eller ett makro som  tvingar Excel att skippa denna begränsning? Är min VBA felaktig på något sätt eller är detta en begränsning i Excel som inte går att åtgärda? Den enkla lösningen är ju att lägga all kopplings-kod i Word-mallen som körs när man öppnar dokumentet (vilket jag f.ö också har prövat) men då måste sökvägen vara absolut vilket inte funkar om man ska kunna etikettera från olika källor.
      Bifogar även en kopia på makrot jag har problem med.
      Med hopp om svar från forumet
       
      //Magnus
       
       
       
    • Av DanneK
      Hej,
      får inte följande att fungera, tänkte att jag säkert gjort ett enkelt fel varvid jag ställer frågan här.
      Använder följande kod (eller, ja, det var ursprungligen en del av en större loop, men jag har försökt få det att fungera och har minskat ned så långt som möjligt) för att exportera givna diagram till en ppt.
      Någonstans på vägen har jag lyckats snurra till det varvid allt fallerar numera.
       
      Microsoft Powerpoint Libary är aktivt
       
      Sub ToMonthly() Dim PP As PowerPoint.Application Dim PPPres As PowerPoint.Presentation Dim PPSlide As PowerPoint.Slide Dim SlideTitle As String Dim shp As Object Dim strPP As String strPP = ThisWorkbook.Path & "\" & "2020board.pptx" Set PP = New PowerPoint.Application Set PPPres = PP.Presentations.Open(strPP) PP.Visible = True Sheets("Utfall").Chart("Diagram 3").CopyPicture _ Appearance:=xlScreen, Format:=xlPicture PPSlide.Shapes.Paste.Select Set shp = PP.ActiveWindow.Selection.ShapeRange shp.Height = 600 shp.Width = 600 With PPPres.PageSetup shp.Left = (.SlideWidth / 2) - (shp.Width / 2) shp.Top = (.SlideHeight / 2) - (shp.Height / 2) End With PP.Activate Set PPSlide = Nothing End Sub  
    • Av DanneK
      Jag är säker på att detta är möjligt, bara det att jag inte är kapabel att förstå…
      Skall se om jag kan beskriva vad jag är ute efter ordentligt.
      Jag önskar presentera data från ett exeldokument och har en massa härliga formler som gör merparten jobbet åt mig efter att importen från den externa datan i sin tur gjorts.
      Nu till problemet.
      Jag skulle under summeringar och liknade i ”Presentation” vilja loopa ut resultaten som uppfyller ett visst antal villkor och lägga till det som nya rader. Det är okänt antal rader var gång, från 0-ca 150st. Antalet kolumner är kända.
      Datan är samlade i en flik ”Data”
      Dvs…
       
      Jag skulle vilja få fram följande:
       
      Rubrik | Summering1 | Summering2| Summering3| - Löst del.
      Data!Dx | Data!Ex| Data!Fx| Data!Kx
      Data!Dx | Data!Ex| Data!Fx| Data!Kx
      Data!Dx | Data!Ex| Data!Fx| Data!Kx
       
      x för okänd rad som uppfyller tre villkor, Datum from, Datum tom, samt ett fritextvärde, där dessa rader enl. ovan är okänt antal.
      Hitintills har alla försök slutat med kaos, likt de flesta VBA försök jag gör, varvid jag inte ens har någon vettig kod att börja med. Alla tips är välkomna, och det behöver inte vara en VBA-lösning, bara jag som misstänker att det är dit jag skall vända mig.
    • Av MvS
      Hallå i forumet!
      Har tidigare adresserat detta forum angående problem med kopplad utskrift av db till Word och trodde först jag hittat svaret. Men efter månader av petande och sökande i så gott som det mesta som skrivits om mailmerge har jag fortfarande problem, om än ett par nivåer upp i kunskapshierarkin!
       
      Har samplat ihop ett VBA-skript från olika källor och som jag har modellerat om lite efter egna behov (Se bifogad fil "MailMerge.txt") och använder tillsammans med den databas jag skapat i Excel med relativt stort omfång (ca 8100 poster). Med denna vill jag via VBA koppla en etikettutskrift-funktion där ett av tre för-preppade Worddokument (Etiketter1, 2, 3.docm) öppnas med uppdaterad etikett-data beroende på mellan vilka årtal posterna har. Jag har tre perioder där villkoren är: (Före 1994), (Efter 1993 och Före 2013) samt (Efter 2012) som jag har angett två konstanter som får agera brytpunkter (1994 och 2012).
      Har som sagt prövat det mesta men har problem med kopplingen som genererar fel svar (se bif. bild "Dialog1.jpg")!
      Någon som kan se var felet ligger i bifogad kopia av VBA?

       

      MailMergeVBA.txt
    • Av MvS
      Jag har gjort en databas i Excel 2013 åt en kompis för hans stora skivsamling. Jag försöker att skapa ett automatiserat flöde där det enkelt ska gå att skriva ut etiketter ur samlingen att fästa på hyllor och lådor där skivorna förvaras. För detta ändamål har jag skapat tre etikettmallar i Word för olika tidsperioder (Mall 1 = 1950 - 1970. mall 2 = 1970 - 1990, mall 3 = Från 1990) som kan användas att märka upp de många lådor som skivsamlingen finns i.
      Jag har försökt hitta VBA-kod som kan bistå med detta så att man bara behöver klicka på en knapp i Excel-databasen för att automatiskt skapa en etikettserie  i Word (mailmerge). Det verkar funka så långt att Word öppnar och påbörjar mailmerge med sen hänger sig programmet i flera minuter och Word kraschar. 
      Så här ser min kod ut för första tidspannet (1950-1970):
      Private Sub Document_Open() Dim wd As Object Dim wDocSource As Object, wDocPath As String Dim strWorkbookName As String Set wDocSource = ThisDocument wDocPath = ThisDocument.Path strWorkbookName = wDocPath & "\Etiketter+Db.xlsm" On Error Resume Next Set wd = GetObject(, "Word.Application") If wd Is Nothing Then Set wd = CreateObject("Word.Application") End If On Error GoTo 0 wDocSource.MailMerge.OpenDataSource Name:= _ strWorkbookName, _ Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _ SQLStatement:="SELECT * FROM `Db$`" With wDocSource.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False End With ActiveDocument.SaveAs2 FileName:= _ wDocPath & "\Etiketter_Pre-1970.docx", _ FileFormat:=wdFormatXMLDocument ChangeFileOpenDirectory _ wDocPath ActiveDocument.SaveAs2 FileName:= _ wDocPath & "\Etiketter_Pre-1970.docx", _ FileFormat:=wdFormatXMLDocument, LockComments:=False, Password:="", _ AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _ EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _ :=False, SaveAsAOCELetter:=False, CompatibilityMode:=15 End Sub Då jag kapar sekvensen efter SQLStatement  (i.e. INNAN begäran om att fullfölja mailmerge) så verkar det gå bra, men då måste man "manuellt" välja "Slutför och koppla" för att etikettserien ska genereras och jag vill att hela processen ska funka automatiskt så att det bara är för användaren att skriva ut! Grunddelen av VBA-koden ovan har jag fått genom en makroinspelning och sedan har jag lagt till delar jag hittat på nätet. En märklig sak dock är att själva filtreringen jag gör underinspelningen i "Redigera mottagarlista" kommer av någon anledning inte med i koden - varför då?
      Jag har också prövat att lägga in "WHERE" argument i SQL-statement efter tips när jag Googlat runt men då hittar inte Word sökvägen till Excel-filen och dokumentet kan inte öppna!
      Känner spontant att detta bara måste funka men antagligen är det något knas med kodningen som ställer till det. Om det finns någon i forumet som har råkat ut för motsvarande och till äventyrs hittat en bra lösning vore jag stort tacksam för hjälp!
       
       
  • Senaste som Tittar

    Inga registrerade medlemmar är inne på denna sida.

  • Obesvarade ämnen

  • Nya ämnen

×
×
  • Skapa nytt...