VBA Нахождение расстояния между столбцами в Excel - PullRequest
0 голосов
/ 26 февраля 2011

Я решил задать этот вопрос на примерах. Я пытался объяснить весь проект, но это выглядело странно, если вы еще не работали над тем же проектом, так что начнем.

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

Первые два столбца нужны моей программе для расчетов (поясняется ниже) и являются основой для всего проекта. Давайте назовем их Data_Before и Data_After.

Следующие два столбца - это расчеты, выполненные на основе данных в Data_Before и Data_After. Эти два столбца - Разница и Процент. Как и в заголовках, предполагается, что Diff - это Data_After - Data_Before, а Percent - Diff / Data_Before.

На данный момент столбцы должны быть рядом друг с другом. Таким образом, если Data_Before находится в столбце «A», то Data_After должен появиться в «B» с Diff в «C» и Percent в «D». Это из-за моих вычислений, поступающих из функции записи макроса. Код, который заполняет ячейку в Diff и Percent ниже

' Diff column
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-2]" 
' Percent column
ActiveCell.FormulaR1C1 = "=RC[-1]/RC[-3]" 

Извините за странную раскраску в коде, "Diff column" и "Percent column" - это комментарии. В любом случае, здесь у нас есть FormulaR1C1, которая делает программу негибкой. Вопрос заключается в том, как найти расстояние между столбцом Diff и столбцом Data_Before или Data_After, чтобы пользователь мог иметь Data_Before в столбце «A» и Data_After в столбце «B», но столбцы Diff и Percent, где бы они ни хотели?

Извините за длину вопроса.

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

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

Sub InsertDiffPercentCalc(ByVal rngDataBeforeColumn As Excel.Range, ByVal rngDataAfterColumn As Excel.Range, ByVal rngTargetDiffColumn As Excel.Range, ByVal rngTargetPercentColumn As Excel.Range)

' Diff column
rngTargetDiffColumn.FormulaR1C1 = "=RC" & CStr(rngDataAfterColumn.Column) & "-RC" & CStr(rngDataBeforeColumn.Column)
' Percent column
rngTargetPercentColumn.FormulaR1C1 = "=RC" & CStr(rngTargetDiffColumn.Column) & "/RC" & CStr(rngDataBeforeColumn.Column)

End Sub

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

Sub InsertDiffPercentCalc()

Dim rngDataBeforeColumn As Excel.Range
Dim rngDataAfterColumn As Excel.Range
Dim rngTargetDiffColumn As Excel.Range
Dim rngTargetPercentColumn As Excel.Range

Set wksSettings = ThisWorkbook.Sheets("<settings sheet name>")
Set wksTarget = Application.Workbooks("<target workbook name>").Sheets("<target sheet name>")

Set rngDataBeforeColumn = wksTarget.Range(wksSetting.range("A2").Value & ":" & wksSetting.range("A2").Value)
Set rngDataAfterColumn = wksTarget.Range(wksSetting.range("B2").Value & ":" & wksSetting.range("B2").Value)
Set rngTargetDiffColumn = wksTarget.Range(wksSetting.range("C2").Value & ":" & wksSetting.range("C2").Value)
Set rngTargetPercentColumn = wksTarget.Range(wksSetting.range("D2").Value & ":" & wksSetting.range("D2").Value)

' Diff column
rngTargetDiffColumn.FormulaR1C1 = "=RC" & CStr(rngDataAfterColumn.Column) & "-RC" & CStr(rngDataBeforeColumn.Column)
' Percent column
rngTargetPercentColumn.FormulaR1C1 = "=RC" & CStr(rngTargetDiffColumn.Column) & "/RC" & CStr(rngDataBeforeColumn.Column)

End Sub

где wksSetting - это имя вашего листа настроек, а wksTarget - имя вашего целевого (выходного) листа.

0 голосов
/ 26 февраля 2011

По вашему комментарию, кажется, вы точно знаете, куда поместить вывод. Правильно? Таким образом, если столбец B был данными после, а столбец A был данными до и пользователь хотел получить столбец diff в столбце G, вы можете использовать его для своей формулы diff:

Range("G1").Formula = "=B1-A1"

Или я неправильно понимаю?

Редактировать

Вы, вероятно, после чего-то вроде этого:

sheet1.Columns(15).column - sheet1.Columns(13).column ' returns 2

Вы можете использовать это для создания формулы R1C1.

...