2017-02-11 15 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 

マクロの場合と同様です。私は仕事ではないので、私は確かに分からない。

シート自体のコードは、私がそこにある他に何を忘れてしまったが、特に2行と、私はそれに応じてそれぞれの行に適用したいのが唯一の作品

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 

のようなものです。 B3 & F3、B4 & F4など私が自力で考えることができると思う他の事柄は、それを手動にするのではなく、ランクの日付に基づいて終了するプライマリゾーンを自動的に調整することです。

+1

は、いくつかのコードを表示します! <3 –

+0

DateAdd関数を参照すると、日付の違いを自動化するのに役立ちます。あなたが最初にすべての変数を設定する限り。 –

+0

'Workbook_Change'が実際に' Worksheet_Change'で、 'Application.EnableEvents = False'を設定したと仮定すると、' Application.Run Formula() 'を' Target.EntireRow.Range( "F1")に置き換えることができます。Value =#02/24/2017# - Date() ' - 変更されたセルの行の列Fが、2月24日から今日までの日数に更新されます。 (明らかに、ハードコードされた日付は、自動プロモーションの日付として計算された日付変数に置き換えることができます)また、 'Cells(Target.Row、" F ")を使用することもできます。/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が無限ループに入るのを止めるでしょう。

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へのパラメータとして変更されたセルを渡すことができます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 = "something"の部分を' macroName = Cells(Target.Row、 "B")。Textに変更しようとしました。 – GingerbreadPK

+0

さて、私はそれを動作させることができたので、元のコードは、Target.Value = [ランク]を使用して、あなたの提案と完全に動作します。私は現在、行 "C"と "D" +特定の月数に基づいて基本的に行 "F"の値を必要としているという点です。したがって、個人のサービス開始時間が2015年2月24日に開始された場合、SPCのセカンダリゾーンに入るためには18か月間のTISが必要です。また、PFCになった日付から2/24/2016まで、6ヶ月間の学年が必要になります。 – GingerbreadPK

+0

私はあなたが何をしているのかを理解するのに苦労しています。ワークシートのスクリーンショットをあなたの質問に貼り付けることができますか? (最初に名前などの個人情報を一般的な値に変更します)次に、さまざまなシナリオでF列に表示する内容の例を示します。 – YowE3K

関連する問題