Как сделать чистую функцию более эффективной? - PullRequest
0 голосов
/ 04 февраля 2020

У меня работает VBA на листе Excel, который переводит данные на листе, чтобы я мог импортировать их в другое приложение.

Следующая функция очищает данные и удаляет перенос текста. Эта функция выполняется долго, когда листы имеют большое количество ячеек. Поскольку я нормализую данные для импорта в реляционную базу данных, на семи разных листах часто много ячеек.

Существует ли более эффективный способ удаления переноса текста и очистки данных в клетки?

Dim ws As Worksheet
Dim x, lrow, lcol, active As Long
Dim r, cel As Range

active = ActiveWorkbook.Worksheets.count
For x = 1 To active
    Set ws = ThisWorkbook.Sheets(x)
    ws.Select
    Select Case ws.name
        Case "Solution", "Description", "Problem", "Buyer", "ProjectType", "Process", "Feature"
            lrow = ws.UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).row
            lcol = ws.UsedRange.Columns(ActiveSheet.UsedRange.Rows.count).Column
            If lrow > 1 Then
                Set r = ws.Range(Cells(2, 1), Cells(lrow, lcol))
                For Each cel In r.Cells
                    cel.WrapText = False
                    cel.Value = Application.WorksheetFunction.Clean(cel.Value)
                Next cel
            End If
        Case Else
    End Select
    ws.Cells(1, 1).Select

ThisWorkbook.Sheets("Solution").Activate
Next x

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Ваш код может быть уменьшен до

Sub Demo()
    Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets
        Select Case ws.Name
            Case "Solution", "Description", "Problem", "Buyer", "ProjectType", "Process", "Feature"
                With ws.UsedRange
                    .WrapText = False
                    .Value = ws.Evaluate("Clean(" & .Address & ")")
                End With
        End Select
    Next
End Sub

На моем оборудовании лист с 100 000 строк 26 столбцов работал примерно за 6 с

Примечание: OP утверждают (в комментарии), что «оно меняет значение каждой ячейки на листе на первое значение на первом листе, с которым сталкивается». - проверено это утверждение, и оно не является точным Этот код работает как рекламируется.

0 голосов
/ 04 февраля 2020

Чтобы удалить свойство переноса текста (и меня удивляет, что это влияет на вашу внешнюю программу), вы должны сделать следующее:

r.WrapText = False

Для Clean, что именно в ячейках, которые вы пытаетесь удалить?

Было бы быстрее прочитать ячейки в массив; обработайте их и запишите обратно.

Что-то вроде: (не отлажено)

Dim V, I as long, J as Long
v = R

for i = 1 to ubound(v)
  for j = 1 to ubound(v,2)
     `worksheetfunction.clean(v(i,j))
     `or some other function to remove unwanted characters
  next j
next i

r.clear
r.value = v

Вы также должны знать, что UsedRange не особенно надежен и может привести к тому, что вы обработаете гораздо больше ячеек, чем необходимо.

На этом форуме есть несколько сообщений, показывающих лучшие методы определения Последней строки и Последнего столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...