Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 循环日期以复制特定列_Excel_Vba - Fatal编程技术网

Excel 循环日期以复制特定列

Excel 循环日期以复制特定列,excel,vba,Excel,Vba,我整理数据以查看同事的工作班次。 表1中有一张显示班次的表格。制定了这些轮班时间。我正在尝试根据今天的日期复制和粘贴班次数据作为值 例如,如果今天是2020年12月31日,则复制范围C3:F10并粘贴为值(即此日期之前的数据)。当日期更改为第二天时,范围从C3:F10更改为C3:G10。我将有一个连续的专栏(一年中的每一天) 这就是我目前所拥有的。我需要一些指导 Private子测试() 对于i=c1至h1 如果工作表(“Sheet1”).Cells(i,1).Value这就是您要尝试的吗?我

我整理数据以查看同事的工作班次。

表1中有一张显示班次的表格。制定了这些轮班时间。我正在尝试根据今天的日期复制和粘贴班次数据作为值

例如,如果今天是2020年12月31日,则复制范围C3:F10并粘贴为值(即此日期之前的数据)。当日期更改为第二天时,范围从C3:F10更改为C3:G10。我将有一个连续的专栏(一年中的每一天)

这就是我目前所拥有的。我需要一些指导

Private子测试()
对于i=c1至h1

如果工作表(“Sheet1”).Cells(i,1).Value这就是您要尝试的吗?我已经对代码进行了注释,所以您在理解它时应该不会有问题。但如果你这么做了,那就直接问吧

代码:

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim i As Long
    Dim lCol As Long
    Dim lRow As Long
    Dim rng As Range
    
    '~~> Change this to the relevant sheet
    Set ws = Sheet1
    
    With ws
        '~~> Find last column which has data in row 1
        lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        '~~> Find last row which has data in Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        
        '~~> Loop through the dates
        For i = 3 To lCol
            '~~> Check if the date is less than today's date
            If .Cells(1, i).Value2 < Date Then
                '~~> identify your range
                If rng Is Nothing Then
                    '~~> Row 3 to last row
                    Set rng = .Range(.Cells(3, i), .Cells(lRow, i))
                Else
                    '~~> Joining ranges
                    Set rng = Union(rng, .Range(.Cells(3, i), .Cells(lRow, i)))
                End If
            Else
                Exit For
            End If
        Next i
        
        '~~> Convert to values in one go
        If Not rng Is Nothing Then rng.Value = rng.Value
    End With
End Sub
选项显式
子样本()
将ws设置为工作表
我想我会坚持多久
暗淡的lCol尽可能长
暗淡的光线和长的一样
变暗rng As范围
“~~>将其更改为相关的工作表
设置ws=Sheet1
与ws
“~~>查找第1行中有数据的最后一列
lCol=.Cells(1,.Columns.Count).End(xlToLeft).Column
“~~>查找A列中有数据的最后一行
lRow=.Range(“A”&.Rows.Count).End(xlUp).Row
“~~>循环浏览日期
对于i=3至lCol
“~~>检查日期是否小于今天的日期
如果.Cells(1,i).Value2<日期,则
“~~>确定您的范围
如果rng不算什么,那么
“~~~>第3行到最后一行
设置rng=.Range(.Cells(3,i),.Cells(lRow,i))
其他的
“~~>连接范围
设置rng=Union(rng,.Range(.Cells(3,i),.Cells(lRow,i)))
如果结束
其他的
退出
如果结束
接下来我
“~~>一次性转换为值
如果Not rng为空,则rng.Value=rng.Value
以
端接头
正在运行:

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim i As Long
    Dim lCol As Long
    Dim lRow As Long
    Dim rng As Range
    
    '~~> Change this to the relevant sheet
    Set ws = Sheet1
    
    With ws
        '~~> Find last column which has data in row 1
        lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        '~~> Find last row which has data in Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        
        '~~> Loop through the dates
        For i = 3 To lCol
            '~~> Check if the date is less than today's date
            If .Cells(1, i).Value2 < Date Then
                '~~> identify your range
                If rng Is Nothing Then
                    '~~> Row 3 to last row
                    Set rng = .Range(.Cells(3, i), .Cells(lRow, i))
                Else
                    '~~> Joining ranges
                    Set rng = Union(rng, .Range(.Cells(3, i), .Cells(lRow, i)))
                End If
            Else
                Exit For
            End If
        Next i
        
        '~~> Convert to values in one go
        If Not rng Is Nothing Then rng.Value = rng.Value
    End With
End Sub
我创建了一个示例文件来测试上述代码


因此,如果要为i
循环执行
,则需要使用列编号而不是字母,因为它不会执行您在此处尝试的操作。因此,对于C:H,对于i=3到8,它将是
,因为C是第3列,H是第8列。否则,您可以为每个循环执行一次操作:
针对工作表(“Sheet1”)中的每个单元格。范围(“C1:H1”)
。。。你的另一件大事是粘贴。您需要指定在图纸中粘贴的位置,而不仅仅是图纸名称。所以
ActiveSheet.Range(“A1”).PasteSpecial xlPasteValues
这非常有效,非常感谢。评论很好,我现在也可以修改我的其他文章了!