我对vba了解一点,我想用vba实现这个目标。 我正在使用一些特殊情况将数据从工作表传输到另一张工作表。
鉴于这种情况: 在另一张表中我有这些范围
我的数据是这样的
AXX | Contact no.
AXX | Address
AXX | Name
AXX | Summary
BXX | Address
BXX | Name
BXX | Contact no.
BXX | Details
CXX | Address
CXX | Name
CXX | Summary
DXX | Address
DXX | Name
DXX | Contact no.
DXX | Address
DXX | Name
我的标识符位于第一列(AXX,BXX ...)。
预期输出为:
Row no| Column A | Column B | Column D | Column E |
1 | | | | |
2 | | | BXX | Address |
3 | | | BXX | Name |
4 | AXX | Contact no. | BXX | Contact no. |
5 | AXX | Address | BXX | Details |
6 | AXX | Name | | |
7 | AXX | Summary | CXX | Address |
8 | | | CXX | Name |
9 | | | CXX | Summary |
10 | | | | |
正如你所看到的,我的标识符是AXX,BXX ......如果它们相似,我会算不上。行和比较它与否。我的范围集中的行数。 BXX没有放在AXX旁边,因为剩下的行是3但是BXX需要4,所以它将被传递到下一个范围。如BXX和CXX所示,还会有一个空白单元格分隔其他值。
目前,我唯一知道的是使用For循环计算行数。想为此感谢您寻求帮助。 我的初始代码获取行数
Dim aa, aaLastrow As Long
aaLastrow = ShtData.Range("A" & Rows.Count).End(xlUp).Row
For aa = 2 To aaLastrow
If ShtData.Cells(aa, 2).Value = ShtData.Cells(bb, 4).Value Then
Sheets("Sheet1").Cells(aa, 1).Value = ShtData.Cells(aa, 2).Value
End If
Next aa
我知道我的代码不正确,我不确定这种方法是否在正确的轨道上。
答案 0 :(得分:1)
=COUNTIF($A:$A, "AXX")
会给你你想要的计数。您可以优化范围,并且可以将引用插入单元格而不是硬盘" AXX"。如果您希望使用VBA,可以将该功能称为Application.Countif(Range, CountWhat)
,其中"范围"是你在VBA和" CountWhat"中定义的范围。是一种变体。
答案 1 :(得分:1)
喜欢这个
Sub test()
Dim Data As Worksheet, ToWs As Worksheet
Dim vData, vDB, vArray
Dim i As Integer, j As Long, n As Long
Dim rngDB(1 To 4) As Range
Set Data = Sheets(1)
Set ToWs = Sheets(2)
vData = Data.Range("a1").CurrentRegion
vArray = Array("A", "B", "C", "D")
With ToWs
Set rngDB(1) = .Range("a4:b10")
Set rngDB(2) = .Range("d2:e5")
Set rngDB(3) = .Range("d7:e10")
Set rngDB(4) = .Range("g2:h10")
End With
For i = 1 To 4
n = 0
rngDB(i).Clear
vDB = rngDB(i)
For j = 1 To UBound(vData)
If vData(j, 1) Like vArray(i - 1) & "*" Then
n = n + 1
vDB(n, 1) = vData(j, 1)
vDB(n, 2) = vData(j, 2)
End If
Next j
rngDB(i) = vDB
Next i
End Sub