Arrays 在列中查找行号并将数据移动到Excel vba

Arrays 在列中查找行号并将数据移动到Excel vba,arrays,excel,vba,row,Arrays,Excel,Vba,Row,我希望你们能帮助我。我有一张Excel表格,里面有数据,我想复制一些值并将它们移动到另一列 当前的数据如下所示: A B ... 20:00:00 2456 21:00:00 2147 22:00:00 5623 23:00:00 1247 00:00:00 3549 01:00:00 1234 ... A B C D ... 20:00:00 2456 21:00:00 2147 2

我希望你们能帮助我。我有一张Excel表格,里面有数据,我想复制一些值并将它们移动到另一列

当前的数据如下所示:

A           B
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00    3549
01:00:00    1234
...
A           B       C      D
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00            3549
01:00:00            1234
...
22:00:00            2418
23:00:00            3245
00:00:00                   3549
01:00:00                   5437
time    value
20:00   100
21:00   200
22:00   300
23:00   400
0:00    500
1:00    600
2:00    700
3:00    800
4:00    900
5:00    1000
6:00    1100
7:00    1200
8:00    1300
9:00    1400
10:00   1500
11:00   1600
12:00   1700
13:00   1800
14:00   1900
15:00   2000
16:00   2100
17:00   2200
18:00   2300
19:00   2400
20:00   2500
21:00   2600
22:00   2700
23:00   2800
0:00    2900
1:00    3000
2:00    3100
3:00    3200
4:00    3300
5:00    3400
6:00    3500
7:00    3600
8:00    3700
9:00    3800
10:00   3900
11:00   4000
12:00   4100
13:00   4200
14:00   4300
15:00   4400
16:00   4500
17:00   4600
18:00   4700
19:00   4800
20:00   4900
21:00   5000
22:00   5100
23:00   5200
我有几天的数据,当我发现字符串“00:00:00”是另一天的开始时,我想将之前的24个值复制到下一列

结果应该是这样的:

A           B
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00    3549
01:00:00    1234
...
A           B       C      D
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00            3549
01:00:00            1234
...
22:00:00            2418
23:00:00            3245
00:00:00                   3549
01:00:00                   5437
time    value
20:00   100
21:00   200
22:00   300
23:00   400
0:00    500
1:00    600
2:00    700
3:00    800
4:00    900
5:00    1000
6:00    1100
7:00    1200
8:00    1300
9:00    1400
10:00   1500
11:00   1600
12:00   1700
13:00   1800
14:00   1900
15:00   2000
16:00   2100
17:00   2200
18:00   2300
19:00   2400
20:00   2500
21:00   2600
22:00   2700
23:00   2800
0:00    2900
1:00    3000
2:00    3100
3:00    3200
4:00    3300
5:00    3400
6:00    3500
7:00    3600
8:00    3700
9:00    3800
10:00   3900
11:00   4000
12:00   4100
13:00   4200
14:00   4300
15:00   4400
16:00   4500
17:00   4600
18:00   4700
19:00   4800
20:00   4900
21:00   5000
22:00   5100
23:00   5200
我已经开始尝试找到等于“00:00:00”的值的行号,将它们保存在数组中,然后在行值(I+1)“00:00:00”和行值(I)“00:00:00”之间求差

感谢和问候,
丹尼尔·杜阿尔特(Daniel Duarte)

这已经过测试:

Sub move()
Dim column As Integer
column = 3

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

   If Cells(i + 1, 1).Value > Cells(i, 1).Value and Cells(i + 1, 1).Value <> "" Then
      Cells(i, column).Value = Cells(i, 2).Value
      Cells(i, 2).Value = ""
   Else
      column = column + 1
      Cells(i, column).Value = Cells(i, 2).Value
      Cells(i, 2).Value = ""
   End If

Next

End Sub
子移动()
将列设置为整数
列=3
对于i=1到单元格(Rows.Count,1).End(xlUp).Row
如果单元格(i+1,1).Value>单元格(i,1).Value和单元格(i+1,1).Value),则为“”
单元格(i,列).Value=单元格(i,2).Value
单元格(i,2)。Value=“”
其他的
列=列+1
单元格(i,列).Value=单元格(i,2).Value
单元格(i,2)。Value=“”
如果结束
下一个
端接头

在这种情况下需要注意的一点是,它正在检查下一个小时是否小于当前时间,即小时在午夜回到零,并且它也会增加粘贴的列。它可以在24小时内的任何时间工作,与分/秒无关

您提到了“24”,所以我认为它是24个元素。时间是一致的还是可变的

下面是VBA中的解决方案

考虑到这样的情况:

A           B
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00    3549
01:00:00    1234
...
A           B       C      D
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00            3549
01:00:00            1234
...
22:00:00            2418
23:00:00            3245
00:00:00                   3549
01:00:00                   5437
time    value
20:00   100
21:00   200
22:00   300
23:00   400
0:00    500
1:00    600
2:00    700
3:00    800
4:00    900
5:00    1000
6:00    1100
7:00    1200
8:00    1300
9:00    1400
10:00   1500
11:00   1600
12:00   1700
13:00   1800
14:00   1900
15:00   2000
16:00   2100
17:00   2200
18:00   2300
19:00   2400
20:00   2500
21:00   2600
22:00   2700
23:00   2800
0:00    2900
1:00    3000
2:00    3100
3:00    3200
4:00    3300
5:00    3400
6:00    3500
7:00    3600
8:00    3700
9:00    3800
10:00   3900
11:00   4000
12:00   4100
13:00   4200
14:00   4300
15:00   4400
16:00   4500
17:00   4600
18:00   4700
19:00   4800
20:00   4900
21:00   5000
22:00   5100
23:00   5200
这就是你要找的吗

Option Explicit
Sub shift()
      Dim Test As String
      Dim NumRows As Integer
      Dim CurrentRow As Integer
      Dim ToCopy As String
      Dim x As Integer
      Dim i As Integer
      ' Set numrows = number of rows of data.
      NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
      ' loop around
      For x = 0 To NumRows - 1
         Range("A2").Offset(x, 0).Select
         Test = ActiveCell.Text
         If Val(Test) = 0 Then
         CurrentRow = ActiveCell.Row
            If ((CurrentRow - 24) > 1) Then
                For i = 1 To 24
                        If ((CurrentRow - i - 24) > 0) Then
                            ToCopy = ActiveCell.Offset(-i - 24 + 1, 1).Text
                            ActiveCell.Offset(-i + 1, 2).Value = ToCopy 
                        End If
                Next i
            End If
         Else

         End If


      Next



End Sub

针对任意情况修改此选项;例如,时间差为0:15

这有点罗嗦,但给了你想法

Option Explicit

Sub shift_arb()
      Dim Test As String
      Dim StartRow As Integer
      Dim EndRow As Integer
      Dim NumRows As Integer
      Dim nZeroRows As Integer
      Dim CurrentRow As Integer
      Dim ToCopy As String
      Dim x As Integer
      Dim i As Integer
      ' Set numrows = number of rows of data.
      NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
      ' Establish "For" loop to loop "numrows" number of times.
      For x = 0 To NumRows - 1
         Range("A2").Offset(x, 0).Select
         Test = ActiveCell.Text

         ' If we meet the critera; store the row values of the zero rows
         If TimeValue(Test) = "12:00:00 AM" Then
            nZeroRows = nZeroRows + 1
            StartRow = EndRow
            EndRow = ActiveCell.Row

             ' Only do this if you've hit the second zero row
             ' After this, we have to backfill the first, since we don't know the
             ' gap between the zeros
             If (nZeroRows > 1) Then
             ' Go from one zero row to the next

                For i = 0 To (EndRow - StartRow)

                    If ((StartRow - i) > 1) Then
                        ToCopy = Cells(StartRow - i, 2).Text
                        Cells(EndRow - i, 3).Value = ToCopy
                    End If

                Next i

                End If

            End If

        Next x

        ' At the end, cleanup, and do the rest.
        Debug.Print StartRow, EndRow, ActiveCell.Row
        For i = 0 To (EndRow - StartRow)
            If ((i + EndRow - 1) < ActiveCell.Row) Then
                ToCopy = Cells(StartRow + i, 2).Text
                Cells(EndRow + i, 3).Value = ToCopy
            End If
        Next i

End Sub
选项显式
副班次_arb()
作为字符串的Dim测试
Dim StartRow为整数
作为整数的Dim EndRow
作为整数的Dim NumRows
将行设置为整数
将CurrentRow设置为整数
以字符串形式复制
作为整数的Dim x
作为整数的Dim i
'Set numrows=数据行数。
NumRows=Range(“A2”,Range(“A2”).End(xlDown)).Rows.Count
“建立”循环到“numrows”循环的次数。
对于x=0到NumRows-1
范围(“A2”)。偏移量(x,0)。选择
Test=ActiveCell.Text
“如果我们符合标准;存储零行的行值
如果时间值(测试)=“12:00:00 AM”,则
nzerorrows=nzerorrows+1
StartRow=EndRow
EndRow=ActiveCell.Row
“只有当你到达第二个零行时才这样做
在这之后,我们必须回填第一个,因为我们不知道
“零与零之间的间隙
如果(nZeroRows>1),则
'从一个零行转到下一个零行
对于i=0到(EndRow-StartRow)
如果((StartRow-i)>1),则
ToCopy=单元格(StartRow-i,2).Text
单元格(EndRow-i,3)。值=ToCopy
如果结束
接下来我
如果结束
如果结束
下一个x
'最后,清理,然后做其余的工作。
Debug.Print StartRow、EndRow、ActiveCell.Row
对于i=0到(EndRow-StartRow)
如果((i+EndRow-1)
Daniel,你每小时都有记录吗?如果是这样,您可以使用
步骤24执行
下一步的
循环,然后执行
范围.Offset()
以获取数据并剪切粘贴。不,可以是一小时、15分钟、分钟或其他频率。这就是我开始查找00:00:00行的原因。您可以编辑您的帖子以包含您尝试过的代码吗?我已经测试了您的代码,它可以查找第一个“00:00:00”,但未检测到下一个,只在单元格“00:00:04”处添加COLLMN。我会努力修改你的代码。非常感谢。您的数据格式只是时间,但实际上也有日期吗?如果是这样的话,在它达到24:00:00之后,它实际上不会重置为0,而是继续运行。仔细检查你的格式。在这种情况下,我的代码将不起作用,但是可以很容易地更改,因为这意味着您可以检查单元格值的日期部分是否与单元格值的时间部分不同。是的,它在另一个字段中包含关联的日期。也许这是一个好办法。我试试看。非常感谢,如果数据的频率可变,那么它可以是一小时、一分钟、15分钟。非常感谢您的快速回答否,这不起作用,他在评论中补充说,这不一定是在小时内。我认为最好的方法是保存所有“00:00:00”的行号,然后将数据从行号(I+1)-行号(I)复制到下一个collumn.danuca9-是;更聪明的想法;但是,这仅假设时间间隔是一致的。好主意!非常感谢asylumax,很抱歉我迟了回复。我已经测试了你的代码,但它似乎工作不正常。嗯。。。我想知道0:00的值是否真的是“0:00”。这可能是问题的一部分。也许文本比较会更好。您可以检查格式,确保数据不是0:00:01或类似的内容。是的,正好是00:00:00。这似乎很简单,但我无法让宏工作。