VBA, избежать ошибок переполнения, обрезать функцию листа - PullRequest
0 голосов
/ 26 ноября 2018

Я получаю ошибку переполнения при попытке обрезать ячейки в моем диапазоне.Строка, на которой я получаю сообщение об ошибке: C.Value = .Trim(C.Value) Возможно, это можно сделать без пересечения?Я пытался без него, но это приводит к ошибке несоответствия.

    Dim masterWB As Workbook
    Dim dailyWB As Workbook
    Dim C As Range

    Application.DisplayAlerts = False

    'Set Current Workbook as Master
    Set masterWB = Application.ThisWorkbook
    'Set some Workbook as the one you are copying from
    Set dailyWB = Workbooks.Open("excelguy.xlsm")


    'Copy the Range from dailyWB and Paste it into the MasterWB
    dailyWB.Sheets("Summary").Range("A1:BJ200").Copy masterWB.Sheets("Master Summary").Range("A1").Rows("1:1")
    'formatting and paste as values
    Workbooks("excelguy Master.xlsm").Activate
    Worksheets("Master Summary").Select

    'trim values
    columns("A:BJ").Select
       With Application.WorksheetFunction
        For Each C In Intersect(columns("A:BJ"), ActiveSheet.UsedRange)  
            C.Value = .Trim(C.Value)  'Overflow Error
        Next C
        End With

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Попробуйте это.Использовать Variant Array быстрее.

Sub Test()

    Dim masterWB As Workbook, dailyWB As Workbook
    Dim C As Range, LRow As Long
    Dim Ws As Worksheet
    Dim rngDB As Range, vDB As Variant
    Dim i As Long, j As Long

    Set masterWB = ThisWorkbook
    Set dailyWB = Workbooks.Open("excelguy.xlsm")
    Set Ws = masterWB.Sheets("Master Summary")

    dailyWB.Sheets("Summary").Range("A1:BJ200").Copy Ws.Range("A1")
    Ws.Activate
    With Ws
        Set rngDB = .UsedRange
        vDB = rngDB
        For i = 1 To UBound(vDB, 1)
            For j = 1 To UBound(vDB, 2)
                vDB(i, j) = Trim(vDB(i, j))
            Next j
        Next i
        rngDB = vDB
    End With

End Sub
0 голосов
/ 26 ноября 2018
  1. Нет необходимости .Select или .Activate ваших рабочих книг / листов.Вы объявили переменные книги, поэтому используйте их !
  2. UsedRange, что может быть ненадежным.Я рекомендую перейти на более стандартный расчет последней строки.Прямо сейчас код использует Column A для определения последней строки для всех столбцов в вашем диапазоне, что, в свою очередь, определяет диапазон, через который вы собираетесь проходить.
  3. Как указано @dwirony, TRIMФункция может быть вызвана непосредственно из VBA.

См. Комментарий @Tim Williams ниже, чтобы определить, является ли приемлемой версия Trim для VBA


Option Explicit

Sub Test()

Dim masterWB As Workbook, dailyWB As Workbook
Dim C As Range, LRow As Long

Set masterWB = Application.ThisWorkbook
Set dailyWB = Workbooks.Open("excelguy.xlsm")

dailyWB.Sheets("Summary").Range("A1:BJ200").Copy masterWB.Sheets("Master Summary").Range("A1").Rows("1:1")

With masterWB.Sheets("Master Summary")
  LRow = .Range("A" & .Rows.Count).End(xlUp).Row
    For Each C In .Range("A2:BJ" & LRow)
        C.Value = Trim(C)
        'C.Value = Application.WorksheetFunction.Trim(C)
    Next C
End With

End Sub

Если вы просто подстригаетезначения, вы можете загрузить свой диапазон в массив, изменить значения в новый массив, а затем выполнить перенос значения вашего нового усеченного массива в диапазон

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