从单元格捕获数据并将值粘贴到另一个工作表上的另一个单元格中

时间:2013-03-13 19:54:24

标签: excel-vba vba excel

我让我的头脑比以前更具挑战性,但是因为我最近没有使用过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旁边,依此类推。我想在保存文件时这样做,或者让它成为她可以打的快捷方式,或者只是废弃它并告诉她这不值得。

3 个答案:

答案 0 :(得分:1)

对于我的示例,我使用单元格G4作为将由您的同事更新的单元格。你必须有一些方法来保持G4的原始值,以便知道它何时被更改。这样做的简单方法是选择一些用户看不到的单元格并将数字存储在那里,以便稍后引用。在这里,我选择了单元格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

答案 1 :(得分: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”的单元格或要更改它的任何内容,在函数的第一行更新该单元格名称,此函数将执行所有操作其余部分。

Where you find the cell name and change the value to "ChangeMe"

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

This shows the date format being in long date format and the number value of the B column being displayed with formatted Currency

修改:我已更新代码,比较完整日期的日期减去时间,而不是之前的每月比较,如果您仍需要减去或添加一个月的日期值,只需使用DateAdd("m", <date>, <value>)添加或减去月份。

编辑: DatePart Function page对于那些想要了解有关DatePart()的更多信息的人来说是一个有用的资源

答案 2 :(得分: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