2017-01-23 4 views
0

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

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

Первый макрос находит пустую строку, глядя в колонке А

Sub FTPstep2() 
' 
' FTPstep2 Macro 
' 

' 
If Application.WorksheetFunction.CountA("A:A") = 0 Then 
    [A1].Select 
Else 
    On Error Resume Next 
    Columns(1).SpecialCells(xlCellTypeBlanks)(1, 1).Select 
    If Err <> 0 Then 
     On Error GoTo 0 
     [A65536].End(xlUp)(2, 1).Select 
    End If 
    On Error GoTo 0 
End If 
End Sub 

Второй макрос удаляет все ниже строки «X»

Sub FTPstep3() 
' 
' FTPstep3 Macro 
' 
With Sheets("Sheet1") 
    .Rows(X & ":" & .Rows.Count).Delete 
End With 
End Sub 

я хотел бы гнездо первого макроса (FTPstep2), где «X» находится во втором макросе (FTPstep3). Я пробовал различные маршруты, но это, как правило, не так, как амперсанд или ожидает, конечные заявления и т.д.

+0

Вы говорите, что, например, у вас есть данные в A1: A500, а затем что-то в A1000: A1005, и вы хотите удалить последнее? – SJR

+1

Также лучше избегать использования '.Select' /' .Activate'] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – BruceWayne

+0

Вы не можете многое сделать с кодом, который так плохо разработан. –

ответ

1

Что вам нужно, это функция, которая возвращает значение, которое вы можете использовать в макросе «FTPstep3»

Проверьте этот код, чтобы увидеть, если он работает

Function FTPstep2() As String 
' 
' FTPstep2 Macro 
Dim returnValue As Integer 

' 
If Application.WorksheetFunction.CountA("A:A") = 0 Then 
    returnValue = 1 
Else 
    On Error Resume Next 
    returnValue = Columns(1).SpecialCells(xlCellTypeBlanks)(1, 1).Row 
    If Err <> 0 Then 
     On Error GoTo 0 
     returnValue = [A65536].End(xlUp)(2, 1).Row 
    End If 
    On Error GoTo 0 
End If 

FTPstep2 = returnValue 

End Function 

Sub FTPstep3() 
' 
' FTPstep3 Macro 
' 
With Sheets("Sheet1") 
    .Rows(FTPstep2 & ":" & .Rows.Count).Delete 
End With 

End Sub 

этот код удалит все строки ниже первой пустой ячейки он находит в колонке «А».

Функции подобны субмаринам, им может быть предоставлен любой ввод (в этом случае я не передаю какой-либо параметр в функцию «FTPstep2»), и они возвращают значение, которое может использоваться в другой процедуре (обратите внимание на строку FTPstep2 = returnValue). Мы также устраняем все инструкции Select, поскольку они здесь не нужны, и их не рекомендуется использовать, поскольку VBA не нужно выбирать ячейки для их изменения. Даже в этом случае мы полагаемся на перемещение по всему листу с использованием End() и Offset(), вы должны убедиться, что это можно улучшить.

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

Счастливое кодирование!

Редактировать: Исправлено короткое определение VBA Function, спасибо @barrowc за указание на это!

+2

«Функции похожи на подмножества, но они не изменяют ни один рабочий лист» звучит как описание UDF (т. Е. Определенный ограниченный тип «Функция», который может быть вызван в формуле), а не описание общего VBA ' Function' – barrowc

+1

Я хотел дать простое определение того, что такое '' '' '' 'функция ', вроде как" sub, но она дает значение как результат ". Возможно, формулировка, которую я использовал, не самая точная. Я мог бы использовать другое определение и отредактировать ответ, что бы вы предложили? –

+1

Ответ выглядит отлично, за исключением «но они не изменяют часть рабочего листа», поэтому, возможно, просто удалите этот бит – barrowc

Смежные вопросы