1

我在脑海中让这变得比它必须的更具挑战性,但由于我最近没有使用 vba 或 excel,所以我以此为借口。请不要质疑方法:) 因为这只是我试图消除的一小步,以节省一些时间,直到我可以重做整个过程。我会做相反的事情,但这是他们正在使用的某种发票......

我在想宏或函数是需要的,而不是公式,因为工作表 2 上的数据每个月都会发生变化,而且我没有可以参考的日期。

我想做的事:

我在工作表 2 上有一个单元格,每月更改一次。我想每月将工作表 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

在我的示例中,我使用单元格G4作为您的同事将更新的单元格。您必须有一些方法来保持原始值,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

请记住,对于此任务,这是一种非常“快速而肮脏”的方法,因为它没有错误处理程序或它的工作方式具有很大的灵活性。


编辑 -

此处引用了您可以使用的另一种方法,并且可以简单地检查给定单元格是否已更改,而无需验证值的差异。

 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 回答
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

这假设您的工作表布局在 Sheet1 中具有“发票值”,并且在 Sheet2 中更改了单元格。您需要为该单元格命名。

使用功能栏左侧的单元格名称框调用更改“ChangeMe”的单元格或您希望将其更改为的任何内容,在函数的第一行更新该单元格名称,此函数将完成所有其余操作。

在哪里找到单元格名称并将值更改为

请务必注意,日期必须针对您的系统区域正确格式化。以确保它显示正确的月份 - 将它们格式化为 LongDate 以便您可以将它们视为 2013 年 3 月 8 日而不是 03/08/13,这可能会随着时间的推移而变得混乱。作为一名英国程序员,约会是我生命中的祸根!

这显示日期格式为长日期格式,B 列的数值显示为格式化货币

编辑:我已经更新了代码以通过完整日期减去时间来比较日期,而不是之前的每月比较,如果您仍然需要减去或添加一个月到任一日期值,只需使用DateAdd("m", <date>, <value>)添加或减去月份.

编辑: DatePart 功能页面对于那些想了解更多有关 DatePart() 的人来说是一个有用的资源

于 2013-03-14T16:51:26.350 回答
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 回答