2017-02-11 2 views
0

Image of the SpreadSheet Я создаю трекер Excel для своей работы, который определяет, когда кто-то находится в пределах вторичной и первичной зон, чтобы быть продвинутым до следующего ранга. Я начал с Excel только, но это было слишком ограничено, поэтому я решил попробовать VBA, которого я никогда раньше не использовал. В настоящее время у меня есть сценарий, который читает, что представляет Ранг текущего человека, а затем рассказывает мне о днях, которые они имеют от Даты Ранга, до того дня, когда они будут в первичной или вторичной зонах.Применить макрос VBA через различные ячейки?

Я могу сделать это только для определенных ячеек, и мне нужно вручную ввести дату их автоматической даты продвижения. Есть ли способ применить один и тот же код по всему листу без необходимости вручную изменять ячейки. Поэтому, если B2 содержит ранг «SPC», тогда F2 будет иметь дни до тех пор, пока индивид в этой строке не будет находиться в первичной зоне для «SGT», и если B3, например, содержит ранг «PFC», тогда F3 будет показывать дни, пока индивидуум находится в Первичной зоне для «SPC» и так далее.

Function Formula() 
Workbook.Sheets("Sheet1").Range("F2").Formula = "=DATEDIF(""2/24/2017"",Today(),""d"")" 
End Function 

Это что-то похожее на Макросы. Я не работаю, поэтому я точно не знаю.

Кодекс для самого листа что-то вроде

Sub Workbook_Change(ByVal Target As Range) 
macroName As String 
If macroName = "PFC" Then 
Application.Run Formula() 
ElseIf macroName = "SPC" Then 
Application.Run Formula2() 
EndIf 
End Sub 

Я забыл, что еще есть, но он работает только для специально Row 2, и я хотел бы, чтобы применить его к каждой строке соответственно. B3 & F3, B4 & F4 и т. Д. Другие вещи, которые, как я думаю, я могу выяснить самостоятельно, будут автоматически корректировать окончание первичной зоны на основе даты ранжирования, а не делать ее ручной.

+1

Показать код !!! <3 –

+0

Также вы можете найти функцию DateAdd, которая поможет вам автоматизировать различия даты. Пока вы настраиваете все свои переменные в первую очередь. –

+0

Предполагая, что 'Workbook_Change' на самом деле' Worksheet_Change', и предположив, что вы установили 'Application.EnableEvents = False', вы можете заменить' Application.Run Formula() 'на' Target.EntireRow.Range («F1»).Значение = # 02/24/2017 # - Date() '- это приведет к обновлению столбца F в строке измененной ячейки, чтобы быть числом дней между 24 февраля и сегодня. (Очевидно, что жесткозаписываемая дата может быть заменена переменной даты, которая была рассчитана как автоматическая дата продвижения.) Альтернативно, вы можете использовать «Ячейки (Target.Row,« F »). Значение = # 02/24/2017 # - Date() '. – YowE3K

ответ

1

На основании кода, который вы указали, было бы проще включить код от Formula в самое событие Worksheet_Change, например.

Sub Worksheet_Change(ByVal Target As Range) 
    Dim macroName As String 
    macroName = "something" 
    If macroName = "PFC" Then 
     Application.EnableEvents = False 
     Cells(Target.Row, "F").Formula = "=DATEDIF(""2/24/2017"",Today(),""d"")" 
     Application.EnableEvents = True 
    ElseIf macroName = "SPC" Then 
     Application.Run Formula2() 
    EndIf 
End Sub 

Это предполагает, что лист, на котором существует измененная ячейка, является листом («Лист1»).

Обратите внимание, что Application.EnableEvents отключен до внесения изменений в лист. Это остановит Excel в бесконечном цикле.


В качестве альтернативы, вы можете передать измененный элемент в качестве параметра Formula:

Function Formula(c As Range) 
    Workbook.Sheets("Sheet1").Cells(c.Row, "F").Formula = "=DATEDIF(""2/24/2017"",Today(),""d"")" 
End Function 

Sub Worksheet_Change(ByVal Target As Range) 
    Dim macroName As String 
    macroName = "something" 
    If macroName = "PFC" Then 
     Application.EnableEvents = False 
     Formula Target 
     Application.EnableEvents = True 
    ElseIf macroName = "SPC" Then 
     Formula2 
    EndIf 
End Sub 

Или еще один способ будет просто передать номер строки измененной ячейки в качестве параметра в Formula:

Function Formula(r As Long) 
    Workbook.Sheets("Sheet1").Cells(r, "F").Formula = "=DATEDIF(""2/24/2017"",Today(),""d"")" 
End Function 

Sub Worksheet_Change(ByVal Target As Range) 
    Dim macroName As String 
    macroName = "something" 
    If macroName = "PFC" Then 
     Application.EnableEvents = False 
     Formula Target.Row 
     Application.EnableEvents = True 
    ElseIf macroName = "SPC" Then 
     Formula2 
    EndIf 
End Sub 

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

Sub Worksheet_Change(ByVal Target As Range) 
    Dim macroName As String 
    Dim mthsToAdd As Integer 
    Dim apd As Date 
    macroName = "something" 
    If macroName = "PFC" Then 
     Application.EnableEvents = False 
     mthsToAdd = 3 
     'Note: The following formula won't correctly handle cases such as 
     '  adding two months to 30 December 2016 (it will calculate 
     '  2 March 2017 in that case, due to "30 February 2017" being 
     '  treated as "2 days after 28 February 2017") 
     Cells(Target.Row, "F").FormulaR1C1 = "=DATEDIF(Today(),DATE(YEAR(RC4),MONTH(RC4)+" & mthsToAdd & ",DAY(RC4)),""d"")" 

     'or, if your formula doesn't need to allow for future changes to column D 
     apd = DateAdd("m", mthsToAdd, Cells(Target.Row, "D").Value) 
     Cells(Target.Row, "F").FormulaR1C1 = "=DATEDIF(Today(),""" & Format(apd, "mm/dd/yyyy") & """,""d"")" 

     'or, if you don't even need to allow for future changes to "Today" 
     apd = DateAdd("m", mthsToAdd, Cells(Target.Row, "D").Value) 
     Cells(Target.Row, "F").Value = apd - Date() 

     Application.EnableEvents = True 
    ElseIf macroName = "SPC" Then 
     Application.Run Formula2() 
    EndIf 
End Sub 
+0

Эй, вот так на работе сейчас пытаемся реализовать сделанные вами предложения. Ошибок нет, но ничто не меняется, когда число лиц изменилось. Думаю, я должен был также упомянуть, что ранг находится в строке «B». Таким образом, в основном, когда кто-то продвигается с PFC на SPC, их первичная и вторичная зоны в строке «F» должны соответственно меняться. Я попытался изменить часть «macroName =» что-то «» на «macroName = Cells (Target.Row,« B »). Текст« посмотреть, приведет ли это к результату, который я ищу, но не к кости. – GingerbreadPK

+0

Итак, я смог заставить его работать, исходный код использовал If Target.Value = [Rank] и отлично работает с вашими предложениями. То, что я сейчас нахожу, это то, что мне нужно значение в строке «F», чтобы по существу быть полностью основано на рядах «C» и «D» + определенное количество месяцев. Так что, если люди, находящиеся в Службе, начали 24/24/2015, им нужно 18 месяцев TIS, чтобы быть во вторичной зоне для SPC. Они также нуждаются в 6-месячном времени в классе с даты, когда они стали PFC, поэтому 24.02.2016. – GingerbreadPK

+0

Я пытаюсь понять, что вам нужно - есть ли шанс, что вы можете вставить скриншот своей рабочей таблицы в свой вопрос? (Сначала измените любую личную информацию, такую ​​как имена, в общие значения.) Затем дайте несколько примеров того, что вы хотите отобразить в столбце F для различных сценариев. – YowE3K

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