【发布时间】:2017-06-01 17:01:59
【问题描述】:
我遇到的问题是,有时数据集中缺少整个标题和数据值,因此使用脚本中的最后一行数据会向上移动一个。例如,如果我在 sheet1 上完全删除 H11:H12,那么与 A11:K11 中的数据集关联的 H 列的值实际上将来自数据集 A13:K13(或单元格值 H14)。
如果相应的标题不存在,第二张图片中显示的空格将不存在。
问题:给出以下代码;您是否认为可以将数据与标题匹配,并在第 2 页上匹配的列旁边使用原始偏移行号并将值粘贴到那里?取而代之的是当前代码(唯一有效的方法是找到最后一行)。
示例/想法: 我认为脚本将必须采用一个单元格(例如 D9 并识别它是一个 D 和偏移量以选择 D10 并将该 D9 记录匹配到工作表 2 列 D 并将 D10 数据粘贴到 D10 而不是 D5 中。
第二个示例,脚本获取 I17 并识别它与工作表 2 列 I 匹配,然后偏移以选择/复制并将 I19 数据粘贴到 I18 而不是 I9 中。
Sub main()
Dim hedaerCell As Range
Dim labelsArray As Variant
With ThisWorkbook.Worksheets("Sheet2") '<--| reference "headers" worksheet
For Each hedaerCell In .Range("A1:K1") '<--| loop through all "headers"
labelsArray = GetValues(hedaerCell.Value) '<--| fill array with all labels found under current "header"
.Cells(.Rows.Count, hedaerCell.Column).End(xlUp).Offset(1).Resize(UBound(labelsArray)).Value = Application.Transpose(labelsArray)
Next
End With
End Sub
Function GetValues(header As String) As Variant
Dim f As Range
Dim firstAddress As String
Dim iFound As Long
With ThisWorkbook.Worksheets("Sheet1").UsedRange '<--| reference "data" worksheet
ReDim labelsArray(1 To WorksheetFunction.CountIf(.Cells, header)) As Variant '<--| size an array to store as many "labels" as passed 'header' occurrences
Set f = .Find(what:=header, LookIn:=xlValues, lookat:=xlWhole) '<--| start seraching for passed 'header'
If Not f Is Nothing Then
firstAddress = f.Address
Do
iFound = iFound + 1
labelsArray(iFound) = f.Offset(1)
Set f = .FindNext(f)
Loop While f.Address <> firstAddress
End If
End With
GetValues = labelsArray
End Function
似乎有一个异常阻止这些单元格值被复制,如果我手动执行,下面的屏幕截图将是正确的。有什么诊断技巧吗?
非常奇怪,因为带有红点的行在两者中都可以正常复制,但是这四行似乎失败了。
【问题讨论】:
-
照片中的数据不是实际数据,而只是占位符。 A 到 K 代表类别标题。任何特殊字符数的值表示在每个类别下正在收集的数据。您可能会注意到某些类别没有特定数据集(行号)的值,因此我找不到将空白单元格复制到第二张表的方法。相反,在当前代码下,它只是忽略任何空白。这就是为什么我可能想偏移它在第二张表中粘贴数据的位置,即数据集的原始行号。
-
所以你试图将顶部数据转换为底部数据 - 基本上只是去掉额外的标题?两个问题:是否保证第一行的所有表头都会被填写,是否保证每隔一行都是表头行?
-
另外,您是对同一张工作表进行更改还是尝试复制到新工作表?
-
它正在将数据复制到具有 A1:K1 范围内预定义标题的新工作表中。我想我可能需要完全重建,现在知道使用最后一行有很多问题,我认为可能有效的是,如果你知道在宏运行时从原始数据中提取行值的方法,然后我们分配它作为变量,并使用它将数据粘贴到 sheet2 中,并使用在数据匹配期间找到的正确列。
-
例如,宏检测从 A2:K3 范围内的数据集,并将第 2 行识别为标题,将第 3 行识别为值。它继续分配一个值为 3 的变量,指定值源自的行号。它继续将数据匹配到正确的标题 A 到 A、B 到 B 等等,但是当它粘贴值时,而不是使用最后一行(就像它当前所做的那样),它将引用行输入的变量(在这种情况下,它的第 3 行)。然后我需要做的就是删除所有完全空白的行,只是简单的格式化。