Макрос, который добавляет новый столбец и применяет формулу

#excel #vba

#excel #vba

Вопрос:

Я очень новичок в Excel, VBA и макросах… Я пытаюсь создать макрос, который, наконец, добавил столбец с именем «XXX», т.Е. после последнего столбца, а затем в этом недавно добавленном столбце макрос должен найти 2 столбца…

Ответ №1:

1. Скопируйте и вставьте формат заголовка

     .Cells(1, LastCol).Copy
    .Cells(1, LastCol   1).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
 
  1. Применить формулу к диапазону столбцов «Время отклика»
 For i = 2 To LastRow

.Cells(i, LastCol   1).Formula = .Cells(i, col2) - .Cells(i, col1)

Next i
 
  1. Преобразование десятичного числа в формат времени

.Cells(i, LastCol 1).NumberFormat = "hh:mm:ss"

РЕДАКТИРОВАТЬ: [Полный код]

    Option Explicit
     
     Sub addformula()
        Dim LastRow As Long
         Dim LastCol As Long
         Dim iRow As Long
         Dim wsh As Worksheets
         
     Dim col1 As Long, col2 As Long 
With ActiveWorkbook.Worksheets("Formula testing")    
    'Find Full Out Gate at Inland or Interim Point (Destination)_actual and Full Out Gate at Inland or Interim Point (Destination)_recvd
    
    With ActiveWorkbook.Worksheets("Formula testing")
    
    col1 = .Cells.Find(What:="Full Out Gate at Inland or Interim Point (Destination)_actual", _
                After:=Range("A1"), LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False).Column
                
    col2 = .Cells.Find(What:="Full Out Gate at Inland or Interim Point (Destination)_recvd", _
                After:=Range("A1"), LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False).Column
                
    With ActiveWorkbook.Worksheets("Formula testing")
    
            LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
            LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
            
            .Cells(1, LastCol   1).Value = "Response Time"
            
          ' Copy Header Fromat
            .Cells(1, LastCol).Copy
            .Cells(1, LastCol   1).PasteSpecial Paste:=xlPasteFormats
            Application.CutCopyMode = False
            
          ' Apply Formula to "Response Time" column range
            For i = 2 To LastRow
                .Cells(i, LastCol   1).Formula = .Cells(i, col2) - .Cells(i, col1) 
 

.Ячейки (i, LastCol 1).NumberFormat = «hh:mm:ss»

             Next i
    
        
         End With
         
      End With
    
    End With
    
    ActiveWorkbook.Worksheets("Formula Testing").UsedRange.Columns.AutoFit
End Sub
 

Комментарии:

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

2. РЕДАКТИРОВАТЬ: @jazz , чтобы получить формат времени, вы можете использовать add this code . Ячейки (i, LastCol 1).NumberFormat = «hh:mm:ss»

Ответ №2:

Я изменил вашу строку формулы на нижеприведенную строку кода.

 Range(Cells(2, LastCol   1).Address amp; ":" amp; Cells(LastRow, LastCol   1).Address).Formula = "=" amp; Cells(2, col2).Address(0, 0) amp; "-" amp; Cells(2, col1).Address(0, 0)
 

Пожалуйста, попробуйте приведенный ниже код.

     Option Explicit

Sub addformula()
    Dim LastRow As Long
    Dim LastCol As Long
    Dim iRow As Long
    Dim wsh As Worksheets
    Dim col1 As Long, col2 As Long
    With ActiveWorkbook.Worksheets("Formula testing")
      With ActiveWorkbook.Worksheets("Formula testing")
    
            col1 = .Cells.Find(What:="Full Out Gate at Inland or Interim Point (Destination)_actual", _
                After:=Range("A1"), LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False).Column
                
            col2 = .Cells.Find(What:="Full Out Gate at Inland or Interim Point (Destination)_recvd", _
                After:=Range("A1"), LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False).Column
                
        With ActiveWorkbook.Worksheets("Formula testing")
            LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
            LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
            .Cells(1, LastCol   1).Value = "Response Time"
            Range(Cells(2, LastCol   1).Address amp; ":" amp; Cells(LastRow, LastCol   1).Address).Formula = "=" amp; Cells(2, col2).Address(0, 0) amp; "-" amp; Cells(2, col1).Address(0, 0)
        End With
      End With
    End With
    ActiveWorkbook.Worksheets("Formula Testing").UsedRange.Columns.AutoFit
End Sub