1

必要以上に頭の中で難しくしているのですが、最近VBAやエクセルを使っていないので言い訳にしています。方法論に疑問を抱かないでください:)これは、プロセス全体をやり直すことができるまで、誰かが時間を節約するために排除しようとしている小さなステップにすぎないためです。私は逆のことをしますが、これは彼らが使用している一種の請求書です....

ワークシート 2 のデータは毎月変更され、参照できる日付がないため、数式ではなくマクロまたは関数が必要であると考えています。

私がしたいこと:

ワークシート 2 に月に 1 回変更されるセルがあります。ワークシート 2 のセルの値を、毎月変更するワークシート 1 のセルに配置したいと考えています。

各月は列 A に表示され、その月のワークシート 2 のセルの値は列 B に配置する必要があります。

Column A         Column B
12/5/2012        $3,459,877.81 
1/8/2013         $9,360,785.62 
2/8/2013        
3/8/2013        
4/8/2013        

したがって、彼女が 2 月のワークシート 1 を変更すると、数値は 2/8 の隣に入力されます。彼女がドキュメントを保存するときにそれを行うか、彼女がヒットできるショートカットにするか、単にスクラップして、価値がないと彼女に伝えることを考えていました.

4

3 に答える 3

1

Cell に参照する名前を付けると、Worksheet_Change 関数に渡された Target パラメーターを使用して、いくつかの優れた処理を実行できます。

'Add this function to the sheet that has the cell being
'+changed by the user (Sheet 2)
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim strCellName As String
    strCellName = "ChangeMe"
    'If the cell we changed was the ChangeMeCell
    If Target.Address = Sheet2.Range(strCellName).Address Then
        'Store value
        Dim intLastRow, intValue As Integer
        intValue = Range(strCellName).Value

        'Find the cell in Sheet 1 Column A that matches this month
        intLastRow = Sheet1.Range("A:A").End(xlDown).Row
        For Each cl In Sheet1.Range("A1:A" & intLastRow).Cells
            'Ensure cell value is date
            If IsDate(cl.Value) Then

                'If date is today's date
                'Note that Math.Round(<date>, 0 ) essentially removes the time
                '+from any date value so #01/02/03 04:05:06# becomes #01/02/03#
                If Math.Round(cl.Value,0) = Math.Round(Now,0) Then
                    'Update column B's value
                    Sheet1.Range("B" & cl.Row).Value = intValue
                End If
            End If
        Next
    End If
End Sub

これは、シート 1 に「請求書の値」を含むシート レイアウトがあり、シート 2 でセルが変更されていることを前提としています。そのセルに名前を付ける必要があります。

関数バーの左側にあるセル名ボックスを使用して、「ChangeMe」または変更したいセルを呼び出し、関数の最初の行でそのセル名を更新すると、この関数が残りのすべてを実行します。

セル名を見つけて値を変更する場所

日付は、システムの地域に合わせて正しくフォーマットする必要があることに注意してください。正しい月が表示されていることを確認するには、LongDate にフォーマットして、2013 年 3 月 8 日ではなく 2013 年 3 月 8 日として表示されるようにします。英国のプログラマーとして言えば、日付は私の人生の悩みの種です!

これは、日付形式が長い日付形式であり、B 列の数値が書式設定された通貨で表示されていることを示しています。

編集:以前の月ごとの比較ではなく、完全な日付から時刻を引いた日付で日付を比較するようにコードを更新しました。いずれかの日付値に月を減算または加算する必要がある場合は、月DateAdd("m", <date>, <value>)を加算または減算するだけです。 .

編集: DatePart 関数ページは、DatePart() について詳しく知りたい場合に役立つリソースです。

于 2013-03-14T16:51:26.350 に答える
1

私の例ではG4、同僚が更新するものとして cell を使用しています。いつ変更されたかを知るために、元の値を保持する何らかの方法が必要G4です。これを行う簡単な方法は、ユーザーから見えないセルを選択し、そこに番号を保存して、後で参照できるようにすることです。ここでは cell を選択しましたAA1。が更新された Sheet2ときに起動できるように、そのシートでのみ変更されたイベントを監視する必要があるため、次のコードを に追加する必要があります。G4

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("G4") <> Range("AA1") Then
        Dim lastRow As Long

        Range("AA1") = Range("G4")
        lastRow = Worksheets("Sheet1").UsedRange.Rows.Count

        Worksheets("Sheet1").Cells(lastRow + 1, 1).Value = Date
        Worksheets("Sheet1").Cells(lastRow + 1, 2).Value = Range("AA1")

    End If
End Sub

これは、エラー ハンドラがなく、動作方法に大きな柔軟性がないため、このタスクの非常に「簡単で汚い」アプローチであることに注意してください。


編集 -

使用できるもう 1 つの方法はここで参照され、値の違いを確認せずに、特定のセルが変更されたかどうかを確認するだけです。

 Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Application.Intersect(Range("G4"), Range(Target.Address)) Is Nothing Then
        Dim lastRow As Long
        Range("AA1") = Range("G4")
         lastRow = Worksheets("Sheet1").UsedRange.Rows.Count

         Worksheets("Sheet1").Cells(lastRow + 1, 1).Value = Date
         Worksheets("Sheet1").Cells(lastRow + 1, 2).Value = Range("AA1")
     End If
 End Sub
于 2013-03-13T20:28:28.363 に答える
0

これで、セル内の数式から値をキャプチャして、別のワークシートの別のセルに配置できるようになりました。ここに私の最終製品があります:

Private Sub Worksheet_Calculate()

  Dim strCellName As String
   strCellName = "ChangeMe"
   If Sheets("Application of Moneys").Range(strCellName).Address <> PrevVal Then
    Dim intLastRow, intValue As Long
    intValue = Range(strCellName).Value

   'Find the cell in Sheet 1 Column A that matches this month
    intLastRow = Sheets("Certificate 1").Range("B:B").End(xlDown).Row
    For Each cl In Sheets("Certificate 1").Range("B13:B25" & intLastRow).Cells
        'Ensure cell value is date
        If IsDate(cl.Value) Then

            'If date is today's date
            'Note that Math.Round(<date>, 0 ) essentially removes the time
            '+from any date value so #01/02/03 04:05:06# becomes #01/02/03#
            If DatePart("m", cl.Value) = DatePart("m", Now()) Then
                'Update column B's value
                Sheets("Certificate 1").Range("H" & cl.Row).Value = intValue
            End If
        End If
    Next
End If
End Sub
于 2013-03-18T15:41:42.777 に答える