Как использовать excel VBA для копирования формулы в соседнюю ячейку при вычислении формулы (с использованием относительных ссылок)?

#excel #vba #excel-formula #excel-365

Вопрос:

Итак, у меня есть рабочая тетрадь, которую я настраивал так:

Снимок экрана рабочей книги (ячейка с 2 в ней-это я вручную вставляю формулу в эту ячейку)

Другой снимок экрана с только что рассчитанной формулой и пустой ячейкой под ней

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

До сих пор мне удавалось разобраться во всем этом самостоятельно, но я не могу понять, как реализовать то, что я хочу сделать дальше:

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

Я пытался создать функцию в vba, которая делает это, но мне трудно понять, как это сделать. Я пытался использовать такие вещи, как [formulaCell].FormulaLocal и PasteSpecial и тому подобное, но, хотя иногда мне удавалось успешно копировать формулу, она всегда либо использует абсолютные ссылки, либо относительные ссылки, которые не меняются (т. Е. Если целевая ячейка равна $A2 в исходной формуле, целевая ячейка по-прежнему равна $A2 в вставленной формуле, и ячейка, на которую она ссылается, не меняется. Я хочу, чтобы он вставлялся как ячейка $A3, так как он вставляется в строку 3 здесь.)

Вот весь пользовательский код, который я написал в этом модуле (и полностью в рабочей книге):

 Function CopyCellContents2(copyFrom As Range, CopyTo As Range) ' reference only, I don't use this in the function copyFrom.Parent.Evaluate "CopyOver2(" amp; copyFrom.Address(False, False) _   amp; "," amp; CopyTo.Address(False, False) amp; ")" CopyCellContents2 = "1" End Function ' (can you tell i copy-pasted from an online tutorial lol)  Private Sub CopyOver2(copyFrom As Range, CopyTo As Range) ' same as above function  CopyTo.Value = copyFrom.Value End Sub  Function CopyFormulaDown(copy__From As Range) ' This is the function that I can't make work copy__From.Parent.Evaluate "CopyForm(" amp; copy__From.Address(False, False) _  amp; ")" CopyFormulaDown = "1" End Function  Private Sub CopyForm(copy__From As Range) ' Same as above  startAddress = ActiveCell.Address ActiveCell.Address = copy__From.Address(False, False) ActiveCell.Select Selection.copy ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste ActiveCell.Address = startAddress ActiveCell.Select Application.CutCopyMode = False  End Sub  Function StaticDate(Copy_To As Range) ' This works well Copy_To.Parent.Evaluate "CopyDate(" _  amp; Copy_To.Address(False, False) amp; ")" StaticDate = "1" End Function  Private Sub CopyDate(Copy_To As Range) ' Same as above  Copy_To.Value = Int(Now()) End Sub  Function BlankOtherCell(BlankedCell As Range) ' This also works how I want it to BlankedCell.Parent.Evaluate "CellBlank(" _  amp; BlankedCell.Address(False, False) amp; ")" BlankOtherCell = "1" End Function  Private Sub CellBlank(BlankedCell As Range) ' Ditto  BlankedCell.Value = "" End Sub    

сама формула, то:

 =IF(AND(COUNTBLANK($B2:$J2)lt;9,ISBLANK($A2)),(StaticDate($A2) CopyFormulaDown($XFD2)),IF(COUNTBLANK($B2:$J2)=9,(BlankOtherCell($A2) BlankOtherCell($XFD3)),"Date Previously Applied"))  

I’m learning as I go so I’m no expert or anything, but I’m having a hard time finding a solution to this one. That wasn’t the only iteration of the broken function I’ve tried, it’s just the latest (I was messing around in the macro recorder in desperation for this one, lol). I’d like to figure this out though since copy-pasting the formula every time manually is a pain and pasting it into the whole column makes excel run like me uphill (slowly and poorly). I’d appreciate any help anyone could give me here, and thanks for reading!