![](/img/trans.png)
[英]How to create Excel list with data that excludes certain types of combinations
[英]VBA Excel - How to recognize certain types of data
我正在尝试建立一个宏,该宏将为我移动一个表(单元格组)到excel电子表格的另一个区域。 我目前已经构建了它(这是代码的相关部分),但是它仅适用于一个表,因为我根据第一个表的位置对其进行了编码。 但是,我的某些电子表格具有更多的表格,并且位置不同(所有表格都堆叠在一起,但是高度不同-所以我不容易做我为第一个表格所做的事情)。
所以我的问题是-有没有一种方法可以对VBA进行编码,以识别每个表的左上角(每个表的左上角的数据始终相同),然后检测表(数据)何时都结束于那个左上角的右边和底部,然后移动所有这些?
我对此很陌生,并为我下面的破旧“编码”感到自豪。 任何帮助,将不胜感激。 我考虑过要使用“ If..Then”语句来检测左上角,但不知道如何从那里去。 感谢您的任何帮助。
' Moving data and headers
Worksheets("Inventory").Range("E6:E14").Cut Worksheets("Inventory").Range("A1:A9")
Worksheets("Inventory").Range("F6:F14").Cut Worksheets("Inventory").Range("B1:B9")
Worksheets("Inventory").Range("G6:G14").Cut Worksheets("Inventory").Range("C1:C9")
Worksheets("Inventory").Range("H8:H14").Cut Worksheets("Inventory").Range("D3:D9")
Worksheets("Inventory").Range("I8:I14").Cut Worksheets("Inventory").Range("E3:E9")
Worksheets("Inventory").Range("J8:J14").Cut Worksheets("Inventory").Range("F3:F9")
Worksheets("Inventory").Range("K8:K14").Cut Worksheets("Inventory").Range("G3:G9")
Worksheets("Inventory").Range("L8:L14").Cut Worksheets("Inventory").Range("H3:H9")
Worksheets("Inventory").Range("M8:M14").Cut Worksheets("Inventory").Range("I3:I9")
' Merging and putting in Days Worked
Range("D1:I1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
样品表:
如果您有一个矩形范围,那么要找到其左上角和右下角:
Sub CornerFinder(RR As Range)
Dim addy1 As String, addy2 As String
addy1 = RR(1).Address(0, 0)
Dim nLastRow As Long, nLastColumn As Long
nLastRow = RR.Rows.Count + RR.Row - 1
nLastColumn = RR.Columns.Count + RR.Column - 1
addy2 = Cells(nLastRow, nLastColumn).Address(0, 0)
MsgBox addy1 & vbCrLf & addy2
End Sub
经过测试:
Sub MAIN()
Dim r As Range
Set r = Range("B9:J37")
Call CornerFinder(r)
End Sub
好吧,根据您的示例数据和示例代码,尝试一下。
Sub Test()
Const tlh As String = "Credited in Report"
With Sheets("Sheet1") 'Change to suit
Dim tl As Range, bl As Range
Dim first_add As String, tbl_loc As Variant
Set tl = .Cells.Find(tlh)
If Not tl Is Nothing Then
first_add = tl.Address
Else
MsgBox "Table does not exist.": Exit Sub
End If
Do
If Not IsArray(tbl_loc) Then
tbl_loc = Array(tl.Address)
Else
ReDim Preserve tbl_loc(UBound(tbl_loc) + 1)
tbl_loc(UBound(tbl_loc)) = tl.Address
End If
Set tl = .Cells.FindNext(tl)
Loop While tl.Address <> first_add
Dim i As Long, lrow As Long, tb_cnt As Long: tb_cnt = 0
For i = LBound(tbl_loc) To UBound(tbl_loc)
Set bl = .Cells.Find(vbNullString, .Range(tbl_loc(i)) _
, , , xlByColumns, xlNext)
lrow = Sheets("Sheet2").Range("A" & _
Sheets("Sheet2").Rows.Count).End(xlUp).Row
.Range(.Range(tbl_loc(i)).Offset(IIf(tb_cnt <> 0, 1, 0), 0), _
bl.Offset(-1, 0)).Resize(, 9).Copy _
Sheets("Sheet2").Range("A" & lrow).Offset(IIf(lrow = 1, 0, 1), 0)
tb_cnt = tb_cnt + 1
Set bl = Nothing
Next
End With
End Sub
这会将数据合并到一个表中。
为了安全起见,我使用副本而不是剪切。 您可以根据自己的需要进行更改。
由于我使用的是复印件,因此我还将另一张纸用于输出。
例如,您在Sheet1中具有以下内容:
它将像这样在Sheet2中合并:
这是您要尝试的吗? 如果没有,您可以继续学习代码。
然后,一旦完成,请对其进行调整以适合您的需求。 :-) HTH。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.