VBA - rearanjare template

Ce este nou in Microsoft Excel 2019?
Informatii despre cum se utilizeaza Microsoft Excel 2019
Calcule, Formule, Functii, Tabele pivot, Analiza datelor, etc
carkalete23
Mesaje: 156
Membru din: Sâm Apr 27, 2013 1:01 pm

VBA - rearanjare template

Mesaj de carkalete23 » Mie Oct 18, 2023 12:52 pm

Salutare tuturor,

as avea nevoie de ajutorul vostru in corectarea unui cod VBA in vederea optimizarii performantelor(uneori ruleaza foarte mult) si in coreactarea unei bucati de cod ce ar trebui sa stearga toate randurile daca in coloana 7 si 11 au valori = 0(coloanele 7 si 11 sunt cele ramase dupa rularea bucatii de cod pana la partea in care se cere in Input Box adaugarea unei valori de catre user)

atasez un fiseir ca exemplu si codul care imi da batai de cap :) + partea de cod comentata in care am incercat sa sterg liniile cu val 0

Multumesc frumos
CP

Cod: Selectaţi tot

Sub TransformExcelFile()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

    Dim FilePath As String
    Dim WB As Workbook
    Dim ws As Worksheet
    Dim lrow As Long
    Dim i As Long
    Dim colRange As Range
    Dim lastCol As Long
    Dim filterRange As Range
    Dim cell As Range
    Dim lastERow As Long
    Dim userValue As String
    Dim progressiveNumber As Integer
    Dim currentNumber As Long
    Dim col1 As Long ' Column number of the first column to check
    Dim col2 As Long ' Column number of the second column to check
    
    ' Prompt the user to open a file and get the file path
    FilePath = Application.GetOpenFilename("Excel Files (*.xls; *.xlsx), *.xls; *.xlsx")

    ' Check if a file was selected
    If FilePath = "False" Then
        MsgBox "No file selected. Exiting..."
        Exit Sub
    End If

    ' Open the selected workbook
    Set WB = Workbooks.Open(FilePath)

    ' Set the active worksheet
    Set ws = WB.ActiveSheet

    ' Delete the first row
    ws.Rows(1).Delete

    ' Remove the second column
    ws.Columns(2).Delete

    ' Rename cell A1 to "ID"
    ws.Cells(1, 1).Value = "ID"

    ' Rename cell B2 to "Finished product"
    ws.Cells(1, 2).Value = "Finished product"

    ' Trim and clean the values in the first row
    For i = 1 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
        ws.Cells(1, i).Value = Trim(WorksheetFunction.Clean(ws.Cells(1, i).Value))
    Next i

    ' Delete all empty rows in the worksheet
    lrow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row
    For i = lrow To 1 Step -1
        If WorksheetFunction.CountA(ws.Rows(i)) = 0 Then
            ws.Rows(i).Delete
        End If
    Next i
   ' Find the last column containing "Material" in the first row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    For i = 3 To lastCol
        If ws.Cells(1, i).Value = "Material" Then
            Exit For
        End If
    Next i

    ' Delete columns from C to the "Material" column
    If i <= lastCol Then
       ws.Columns("C:" & Split(Cells(1, i - 1).Address, "$")(1)).Delete

    End If
    
  ' Loop through column B and copy values from column C where B is not blank
    For Each cell In ws.Range("B1:B" & lrow)
        If Not IsEmpty(cell.Value) Then
            cell.Value = ws.Cells(cell.Row, "C").Value
        End If
    Next cell
    
     ' Find the last row with a value in column E
    
    lastERow = ws.Cells(Rows.Count, "E").End(xlUp).Row

    ' Fill down values in column B
    For i = 3 To lastERow
        If IsEmpty(ws.Cells(i, 2)) Then
            ws.Cells(i, 2).Value = ws.Cells(i - 1, 2).Value
        End If
    Next i

    ' Remove formulas in column B
    ws.Range("B:B").Value = ws.Range("B:B").Value
    
     ' Fill down values in column L
    For i = 3 To lastERow
        If IsEmpty(ws.Cells(i, 12)) Then
            ws.Cells(i, 12).Value = ws.Cells(i - 1, 12).Value
        End If
    Next i

   ' Fill down values in column M
    For i = 3 To lastERow
        If IsEmpty(ws.Cells(i, 13)) Then
            ws.Cells(i, 13).Value = ws.Cells(i - 1, 13).Value
        End If
    Next i

    ' Remove formulas in column B
    ws.Range("B:B").Value = ws.Range("B:B").Value
    
    
    
    
     'Find the last row in column C
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
    
    ' Loop through each row in column C
    For i = 1 To lastRow
        ' Check if the cell in column C is blank
        If IsEmpty(ws.Cells(i, "C").Value) Then
            ' Copy the value from column P to column C
            ws.Cells(i, "C").Value = ws.Cells(i, "P").Value
        End If
        
        ' Check if the cell in column C is blank
        If Trim(ws.Cells(i, "D").Value) = "" Then
            ' Copy the text from column O (from the right till the first space) to column D
            Dim cellO As String
            cellO = Trim(ws.Cells(i, "O").Value)
            ws.Cells(i, "D").Value = Right(cellO, Len(cellO) - InStrRev(cellO, " "))
        End If
    Next i
    
    
    
   '  Filter and delete rows in column R
    ws.Range("Q:Q").AutoFilter Field:=1, Criteria1:="="
    ws.Range("Q:Q").AutoFilter Field:=1, Criteria1:="Semi finished goods usage"

' Delete visible rows (i.e., rows that meet the filter criteria)
    On Error Resume Next
    ws.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0

' Turn off the filter
    ws.AutoFilterMode = False

' Filter and delete blank rows in column R
    ws.Range("Q:Q").AutoFilter Field:=1, Criteria1:="="
    ws.Range("Q:Q").AutoFilter Field:=1, Criteria1:=""

' Delete visible rows (i.e., rows that meet the filter criteria)
    On Error Resume Next
    ws.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0

' Turn off the filter
    ws.AutoFilterMode = False
    
    
    
    
  ' Dim col1 As Long ' Column number of the first column to check
   ' Dim col2 As Long ' Column number of the second column to check
    
    ' Set the worksheet, columns to check, and last row
   ' Set ws = ThisWorkbook.Sheets("Sheet1") ' Replace "Sheet1" with your sheet name
  '  col1 = 1 ' Replace with the column number you want to check
   ' col2 = 2 ' Replace with the column number you want to check
  '  lastRow = ws.Cells(ws.Rows.Count, col1).End(xlUp).Row
    
    ' Loop through the rows from the bottom to the top
   ' For i = lastRow To 2 Step -1 ' Start from the last row and go up to the 2nd row
   '     If ws.Cells(i, col1).Value = 0 And ws.Cells(i, col2).Value = 0 Then
            ' If both columns have zero values, delete the row
     '       ws.Rows(i).Delete
     '   End If
   ' Next i
    
 
 
    
    
    
    
    
    
    
    

' Get the user input for the value (mandatory)
    userValue = InputBox("Please enter a value to be concatenated with the ID:")
    
 ' Set the initial value for the progressive number
currentNumber = 1
    
    ' Check if the user provided a value
    If userValue = "" Then
        MsgBox "You must provide a value. Exiting..."
        Exit Sub
    End If
    
    
For i = 2 To lastERow
    If Not IsEmpty(ws.Cells(i, 5).Value) Then
        ' Check if the user entered a value, and if not, use the progressive number
        If userValue <> "" Then
            ws.Cells(i, 1).Value = currentNumber & "_" & userValue
        End If
        currentNumber = currentNumber + 1
    End If
Next i
    
    
    ws.UsedRange.Columns.AutoFit
    
    
    
    
   Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

carkalete23
Mesaje: 156
Membru din: Sâm Apr 27, 2013 1:01 pm

Re: VBA - rearanjare template

Mesaj de carkalete23 » Mie Oct 18, 2023 1:22 pm

Mai jos si detaliile codului:
Setează modul de calcul pe manual și dezactivează actualizarea ecranului pentru a îmbunătăți performanța.
Solicită utilizatorului să selecteze un fișier Excel.
Deschide fișierul selectat și setează foaia de lucru activă ca fiind prima foaie de lucru.
Șterge primul rând al foii de lucru.
Elimină a doua coloană a foii de calcul.
Redenumește celula A1 în "ID" și celula B2 în "Finished Product".
Taie și curăță valorile din primul rând al foii de lucru.
Șterge toate rândurile goale din foaia de calcul.
Găsește ultima coloană care conține "Material" în primul rând.
Se șterg coloanele de la C până la coloana "Material".
Rulează în buclă prin coloana B și copiază valorile din coloana C în cazul în care B nu este goală.
Se găsește ultimul rând cu o valoare în coloana E.
Completează valorile din coloana B.
Îndepărtează formulele din coloana B.
Completează valorile din coloana L.
Completează valorile din coloana M.
Îndepărtează formulele din coloana B.
Găsește ultimul rând din coloana C.
Rulează prin fiecare rând din coloana C și copiază valoarea din coloana P în coloana C dacă celula din coloana C este goală.
Parcurge în buclă fiecare rând din coloana C și copiază textul din coloana O (de la dreapta până la primul spațiu) în coloana D dacă celula din coloana D este goală.
Se filtrează și se șterg rândurile din coloana R în cazul în care valoarea din coloana R este egală cu "Semi finished goods usage".
Se filtrează și se șterg rândurile goale din coloana R.
Obține datele introduse de utilizator pentru o valoare (obligatorie).
Setează valoarea inițială pentru numărul progresiv.
Se verifică dacă utilizatorul a furnizat o valoare. În caz contrar, se utilizează numărul progresiv.
Parcurge rândurile de jos în sus și concatenează numărul progresiv și valoarea utilizatorului cu valoarea din coloana A, dacă valoarea din coloana A nu este goală.
Se ajustează automat coloanele foii de calcul.
Setează modul de calcul pe automat și activează actualizarea ecranului.

Scrie răspuns

Înapoi la “Intrebari despre Excel 2019”