Страницы: 1
RSS
VBA: удалить повторяющийся путь "oExcel.ActiveWorkbook.ActiveSheet.Range"
 
В макросе, написанном для CATIA получились нереально длинные и неудобные строки.
Например:  
Код
If Mid(oExcel.ActiveWorkbook.ActiveSheet.Range("B17"), 1, 4) = "Z1D2" Then
        doc.Parameters.Item("Rev1Chg1").ValuateFromString oExcel.ActiveWorkbook.ActiveSheet.Range("B48") & ", " & oExcel.ActiveWorkbook.ActiveSheet.Range("I48") & " " & oExcel.ActiveWorkbook.ActiveSheet.Range("J48") & ", " & Format(oExcel.ActiveWorkbook.ActiveSheet.Range("L48"), "MM/DD/YYYY") & ". " & vbCrLf & vbCrLf & oExcel.ActiveWorkbook.ActiveSheet.Range("B50")
    Else
        doc.Parameters.Item("Rev1Chg2").ValuateFromString oExcel.ActiveWorkbook.ActiveSheet.Range("C47") & " " & oExcel.ActiveWorkbook.ActiveSheet.Range("D47") & ", " & oExcel.ActiveWorkbook.ActiveSheet.Range("B48") & ", " & oExcel.ActiveWorkbook.ActiveSheet.Range("I48") & " " & oExcel.ActiveWorkbook.ActiveSheet.Range("J48") & ", " & Format(oExcel.ActiveWorkbook.ActiveSheet.Range("L48"), "MM/DD/YYYY") & ". " & vbCrLf & vbCrLf & oExcel.ActiveWorkbook.ActiveSheet.Range("B50")
 End If
Каждый раз указывается полный путь "oExcel.ActiveWorkbook.ActiveSheet.Range(XX)"

Как можно сократить их?
Или можно как то одну строку перенести на несколько строк для удобства чтения?
 
Смотри в сторону With ... End With

Символ _ перенос на новую строку
Изменено: Grr - 20.10.2015 08:21:20
 
Код
dim ws as object,s as string
set ws = oExcel.ActiveWorkbook.ActiveSheet
s = ws.Range("B48") & ", " & ws.Range("I48") & " " & ws.Range("J48") & ", " & Format(ws.Range("L48"), "MM/DD/YYYY") & ". " & vbCrLf & vbCrLf & ws.Range("B50")
If Mid(ws.Range("B17"), 1, 4) = "Z1D2" Then
        doc.Parameters.Item("Rev1Chg1").ValuateFromString s
    Else
        doc.Parameters.Item("Rev1Chg2").ValuateFromString ws.Range("C47") & " " & ws.Range("D47") & ", " & s
 End If
Учитесь искать в коде одинаковые операции/строки и выносить их за пределы блока, в котором они повторяются. Тогда коды будут и понятнее и короче.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Учитесь искать в коде одинаковые операции/строки и выносить их за пределы блока, в котором они повторяются. Тогда коды будут и понятнее и короче.
ок! Запомню.
Спасибо. =)
 
Цитата
trn09 написал: и понятнее и короче
и, говорят, немного быстрее
F1 творит чудеса
 
Код
With oExcel.ActiveWorkbook.ActiveSheet
If Mid(.Range("B17"), 1, 4) = "Z1D2" Then
        doc.Parameters.Item("Rev1Chg1").ValuateFromString _
        .Range ("B48") & ", " & _
        .Range("I48") & " " & _
        .Range("J48") & ", " & _
        Format(.Range("L48"), "MM/DD/YYYY") & ". " & _
        vbCrLf & vbCrLf & .Range("B50")
    Else
        doc.Parameters.Item("Rev1Chg2").ValuateFromString _
        .Range ("C47") & " " & _
        .Range("D47") & ", " & _
        .Range("B48") & ", " & _
        .Range("I48") & " " & _
        .Range("J48") & ", " & _
        Format(.Range("L48"), "MM/DD/YYYY") & ". " & _
        vbCrLf & vbCrLf & .Range("B50")
End If
End With
Согласие есть продукт при полном непротивлении сторон
 
Sanja,Вот так вообще красота! =)
Спасбо!
 
Вы бы уж совместили тогда:
Код
dim s as string
With oExcel.ActiveWorkbook.ActiveSheet
    s = .Range ("B48") & ", " & .Range("I48") & " " & _
        .Range("J48") & ", " & Format(.Range("L48"), "MM/DD/YYYY") & ". " & _
        vbCrLf & vbCrLf & .Range("B50")
    If Mid(.Range("B17"), 1, 4) = "Z1D2" Then
        doc.Parameters.Item("Rev1Chg1").ValuateFromString s
    Else
        doc.Parameters.Item("Rev1Chg2").ValuateFromString _
        .Range ("C47") & " " & .Range("D47") & ", " & s
    End If
End With
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Уважаемые коллеги, я - СУМЕЛ "превратить простой вопрос в огромную проблему" (ц. The_Prist)

Что мешает работать коду:

Public Sub W()

   Dim WS As Worksheet
   Dim R As Range
   
   For Each WS In ThisWorkbook.Sheets
       Set R = WS.Range(Cells(1, 1))
   Next

End Sub

?!
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Мне лично мешает понять, что мешает коду, отсутствие постановки задачи - что этот код должен по Вашему делать?
Тогда можно будет более точно направить. А так - пока коду мешает то, что записано в ячейке А1 активного листа. Там должен быть адрес диапазона.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, это пример, выросший из фрагмента большой программы. Сейчас я хочу, чтобы этот пример дошёл до конца в пошаговом режиме на абсолютно пустой книге. А он, зараза, застревает на строке "Set R..."
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Алексей Вячеславович,
Нужно видеть весь код, а желательно и пример данных в файле. Иначе не понятно ничего.
 
Алексей Вячеславович,
И Дмитрий сказал, что в ячейке A1 стоит что-то не то на момент выполнения строки Set R.
 
Кажется, что-то доходит. Я ожидал присвоить переменной R - сам диапазон (как объект).
Чтобы потом извлекать из этого объекта нужные мне свойства, обращаясь к переменной.
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Спасибо глубокое всем, вопрос переносится на завтра.
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Алексей Вячеславович,
Ну так, а в A1 на момент выполнения Set R есть этот диапазон? Или там какое-то значение?
 
Сейчас в А1 - пусто. Я хотел использовать переменную R как контейнер свойств варьируемых диапазонов (в примере - диапазона А1). Чтобы затем, обратившись к этой переменной, производить некие процедуры с  хранимым в ней диапазоном. Посчитать количество строк... пробежаться по ячейкам, меняя их содержимое...
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Вообще, в основной программе ожидается нечто вроде

Set R = Range(Cells(N1,N2),Cells(M1,M2))

То есть, хотел присвоить переменной - сам диапазон ячеек, как объект.
Изменено: Алексей Вячеславович - 20.02.2025 19:17:11
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Код
Set R = WS.Range(Cells(1, 1))

код видит это так:
Set R = WS.Range("Адрес диапазона из ячейки Cells(1, 1)")
Если в А1 пусто - то код получается таким:
Код
Set R = WS.Range("")

сами понимаете - это недопустимо.
Если в ячейке А1 будет записано слово "привет", то код будет таким:
Код
Set R = WS.Range("привет")

дальше, думаю, продолжать нет смысла. Т.е. надо либо в А1 указать адрес конкретной ячейки или диапазона("F34" или "A1:G50") или указывать этот диапазон напрямую в коде.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо за науку, дорогие коллеги! Пошёл грызть гранит...
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: ...код видит это так:...
Дмитрию респект)
Согласие есть продукт при полном непротивлении сторон
 
На посошок:

"А, видимо, действительно дело в этом - у тебя явно прописано, на каком листе находится Range, но не прописано, на каком листе находятся Cells, поэтому если активный лист не совпадает с листом table, происходит ошибка."

(ответ с форума 20-летней давности :))
http://bbs.vbstreets.ru/viewtopic.php?f=7&t=27850
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Цитата
Алексей Вячеславович написал:
у тебя явно прописано, на каком листе находится Range, но не прописано, на каком листе находятся Cells
До кучи да, согласен. Можно и это закинуть, но. Здесь это не важно, т.к. указан только один объект Cells внутри Range. Поэтому Cells не воспринимается как часть Range, а просто берется значение указанной ячейки. И ведь она может быть совершенно намеренно берется именно с активного листа :) Собственно, поэтому и нужна четкая постановка решаемой задачи, чтобы понимать, где что может быть неверно.
А вот когда указано два Cells(Range(Cells(1,1), Cells(10,2))  - тогда да, и активный лист и то, где записан код, и к чему отнесен Range - играют роль более весомую. Это все я описывал еще здесь: Как обратиться к диапазону из VBA
Изменено: Дмитрий(The_Prist) Щербаков - 21.02.2025 12:09:49
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий,
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
Страницы: 1
Читают тему
Наверх