2014-02-17 19 views
2

У меня есть книга «Task Tracker», в которой используются столбцы A: J для отображения и вычисления информации о задаче (A: E для введенных пользователем данных, F: J содержат формулы, которые используют информация в C: E и выполнять вычисления. F: J - скрытые ячейки в пользовательском представлении.) Остальная часть столбцов отображает карту тепла, где задачи выпадают на временной шкале и независимо от того, работают они вовремя, отстают или полны.Excel VBA - Insert Row & Insert Column Macros

Есть две кнопки для использования пользователями: одна для вставки новой строки и одна для вставки нового столбца. Макрос InsertRow() вставляет строку в список, а затем копирует формулы из указанной строки. Макрос InsertColumn() находит последний использованный столбец на листе и копирует все из столбца слева от него.

Первоначально у меня был макрос для InsertRow с использованием Range, который скопирован из столбца F (где начинаются формулы) в столбец XFD. Однако, как только я создал макрос InsertColumn, я понял, что я не могу так использовать InsertRow, потому что InsertColumn должен найти последний столбец, содержащий данные на листе, и добавить новый вправо ... и если InsertRow запускается первым, InsertColumn не будет работать, потому что значение lastColumn возвращается как индекс столбца XFD.

Я ищу помощь с: мне нужно найти значение lastColumn в моем InsertRow макроса, а затем использовать это значение в качестве части диапазона, когда программа выполняет копирование/вставка часть кода. Я думаю, что проблема, которую я испытываю, связана с тем, что код, который я использую, чтобы найти последний столбец, возвращает индекс, а функции Range требуется имя столбца.

Вот что у меня есть для обоих макросов:

Sub InsertTaskRow() 

' InsertTaskRow Macro 
' 
' This macro inserts a new row below whatever role the user currently has selected, then 
' copies the formulas and formatting from above down to the new row 

    Dim lastColumn As Long 
    Dim currrentRow As Long 
    Dim newRow As Long 

    lastColumn = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Column 

    currentRow = ActiveCell.Row 
    newRow = currentRow + 1 
    ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown 

    Range("F" & currentRow & ":" & lastColumn & currentRow).Copy Destination:=Range("F" & newRow & ":" & currentRow & newRow) 

End Sub 


Sub InsertColumn() 

' InsertColumn Macro 
' 
' This macro copies the formulas and formatting from the last data-containing column 
' in the worksheet, and pastes it into the next column to the right. 

    Dim lastColumn As Long 

    lastColumn = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Column 

    MsgBox lastColumn 

    Columns(lastColumn).Copy Destination:=Columns(lastColumn + 1) 

End Sub 

ответ

1

Вы можете попытаться изменить свои lastColumn на мест где следующее:

lastColumn = ActiveSheet.Range("A1").End(xlToRight).Column 

Это будет растягиваться диапазон для всех используемых клеток. Я попытался использовать clCellTypeLastCell, но он тянул дальше, чем необходимо, без видимых причин; даже после удаления всех столбцов, которые, как утверждалось, были применимы. Просто FYI, нет проблем с использованием индексов или имен столбцов при использовании Range() - даже взаимозаменяемо, они оба полностью квалифицированы.

+0

спасибо. Я попытался использовать этот код, чтобы найти последний столбец, но вместо поиска последнего столбца * используется *, он возвращает последний столбец на листе. – amfrancis

+2

Это связано с тем, что данные в строке 1 пусты: xlToRight потребности будут поступать в первую пустую ячейку, когда на данные, или на первые данные, когда пуст. – mansuetus