Return headers 如果列包含特定字符串
Return headers if column contains certain string
我有一个名为 Input 的 sheet。顶行 A1:O1 包含 parent,下面的行(长度不同)包含 URL。一些 URL 在 parent 之间共享,我想要 return 一个 URL 列表,以及它们的 parent 是什么。我试过 concatenate(if(index(match 但公式变得太大。我见过的类似问题都只寻找一个输出,通常是一个数字。我对 VBA 解决方案持开放态度,但非常非常对创建我自己的代码的了解最少。
示例:
新闻---名人----财经
CNN------复杂------福布斯
福布斯---CNN
我要returnCNN新闻名人,福布斯新财经,复杂名人。我不介意此输出的格式。
由于您在 A:O 中有数据,我假设 Q 列是空白的。在 Q 列中,列出唯一值(因此在您的示例中,Q1 是 "CNN",Q2 是 "Complex",Q3 是 "Forbes"。您可以使用 "remove duplicates"获取唯一 URL 的列表)。此代码将遍历从 A 列到 O 列的使用范围(从第 2 行到最后使用的行),然后将 "answer" 放在 R 列中。
Sub test()
Dim headerRange As Range, uniqueName As String, i As Integer, totalNames As Integer, lastHeadCol As Integer, lastRow As Integer, cel As Range
Dim replaceString As String
lastRow = UsedRange.Rows.Count ' Find the last used row
lastHeadCol = Cells(1, 1).End(xlToRight).Column 'find the last column
totalNames = Cells(1, 17).End(xlDown).Row 'find out how many unique names there are
For i = 1 To totalNames
uniqueName = Cells(i, 17).Value 'Get the unique name to check for in each column
replaceString = uniqueName 'Start off the "answer" with the unique name
For Each cel In Range(Cells(2, 1), Cells(lastRow, lastHeadCol)) ' for each cell in the range, starting at A2
If cel.Value = uniqueName Then 'If that cell's value IS the unique name then
replaceString = replaceString & " " & Cells(1, cel.Column).Value 'add that name to the string
Cells(i, 17).Offset(0, 1).Value = replaceString ' update the "answer"
End If
Next cel
Next i
End Sub
可能存在问题 - 例如,假设你的 URL 块在第 90 行结束,但你在第 99 行中有不相关的数据,它会将范围设置为下降到 99 - 如果是这种情况,您可以将 "lastRow" 更改为
lastRow = cells(1,1).End(xldown).Row
这有帮助吗?
编辑:如果将来您的代码以 O 以外的列结尾,您可以替换“17"s in that code above with "lastHeadCol + 2”。 VBA 将获得最后使用的带有 header 的列(比如 E 列,即第 5 列),然后在 G 列(第 7 列,又名 5 + 2)中添加 URL 等。从技术上讲,这是编写代码的更好方法,因为它较少依赖某些东西 "hard-coded"(又名 "magic numbers")。
我制作了一个 VBA 函数,它应该就是这样做的。基于我的其他 function 类似性质。不优雅但能胜任。
Public Function FINDHEADERWHERESUBSTRINGFITS(Target As Range, Condition As String)
Dim rng As Range
NumCols = Target.Columns.Count 'counts how many header values we can choose of
Dim Headers() 'defines separate arrays for headers and values (turned out to be obsolete, see variable x)
ReDim Headers(1 To NumCols)
Dim ValuesArr()
ReDim ValuesArr(1 To NumCols)
HeaderRow = Target.Row 'row in which headers are located
LastRow = HeaderRow + Target.Rows.Count - 1 'last row with values
FirstColumn = Target.Column 'first column with values
LastColumn = FirstColumn + Target.Columns.Count - 1 'last column with values
For k = FirstColumn To LastColumn 'for each column
i = i + 1 'set array position
For Each rng In Range(Cells(HeaderRow, k), Cells(LastRow, k)) 'for each value
If rng.Row <> HeaderRow Then 'I mean value, not header
If InStr(Condition, CStr(rng.Value2)) > 0 Then Headers(i) = Cells(HeaderRow, k).Value2 'if it's a substring of the condition then set the corresponding header
End If
Next
Next
FINDHEADERWHERESUBSTRINGFITS = Replace(Replace(Join(Headers, ","), ",,", ","), ",,", ",")
End Function
返回,逗号*比以往任何时候都多,最终的 URL 查找器**。
*抱歉老兄,你说格式无关紧要
**有限制,请参阅评论
Public Function FINDHEADERWHERESUBSTRINGFITS(Target As Range, Condition As String)
Dim rng As Range
HeaderRow = Target.Row 'row in which headers are located
LastRow = HeaderRow + Target.Rows.Count - 1 'last row with values
FirstColumn = Target.Column 'first column with values
LastColumn = FirstColumn + Target.Columns.Count - 1 'last column with values
NumCols = Target.Columns.Count 'counts how many header values we can choose of
NumCells = Target.Cells.Count - (LastColumn - FirstColumn + 1) 'counts how many URLs we can choose of
Dim Headers() 'defines separate arrays for headers and values
ReDim Headers(1 To NumCols)
Dim ValuesArr()
ReDim ValuesArr(1 To NumCells)
For k = FirstColumn To LastColumn 'for each column
i = i + 1 'set array position
For Each rng In Range(Cells(HeaderRow + 1, k), Cells(LastRow, k)) 'for each value
If rng.Row <> HeaderRow Then 'I mean value, not header
If InStr(CStr(rng.Value2), Condition) > 0 Then
Headers(i) = Cells(HeaderRow, k).Value2 'if it's a substring of the condition then set the corresponding header
j = j + 1 'increases the array position counter by one (not to overwrite the previous entry)
ValuesArr(j) = CStr(rng.Value2) 'inserts URL to array position
End If
End If
Next
Next
FINDHEADERWHERESUBSTRINGFITS = Replace(Replace(Join(Headers, ","), ",,", ","), ",,", ",") & "; " & Replace(Replace(Join(ValuesArr, ","), ",,", ","), ",,", ",")
End Function
我有一个名为 Input 的 sheet。顶行 A1:O1 包含 parent,下面的行(长度不同)包含 URL。一些 URL 在 parent 之间共享,我想要 return 一个 URL 列表,以及它们的 parent 是什么。我试过 concatenate(if(index(match 但公式变得太大。我见过的类似问题都只寻找一个输出,通常是一个数字。我对 VBA 解决方案持开放态度,但非常非常对创建我自己的代码的了解最少。
示例:
新闻---名人----财经
CNN------复杂------福布斯
福布斯---CNN
我要returnCNN新闻名人,福布斯新财经,复杂名人。我不介意此输出的格式。
由于您在 A:O 中有数据,我假设 Q 列是空白的。在 Q 列中,列出唯一值(因此在您的示例中,Q1 是 "CNN",Q2 是 "Complex",Q3 是 "Forbes"。您可以使用 "remove duplicates"获取唯一 URL 的列表)。此代码将遍历从 A 列到 O 列的使用范围(从第 2 行到最后使用的行),然后将 "answer" 放在 R 列中。
Sub test()
Dim headerRange As Range, uniqueName As String, i As Integer, totalNames As Integer, lastHeadCol As Integer, lastRow As Integer, cel As Range
Dim replaceString As String
lastRow = UsedRange.Rows.Count ' Find the last used row
lastHeadCol = Cells(1, 1).End(xlToRight).Column 'find the last column
totalNames = Cells(1, 17).End(xlDown).Row 'find out how many unique names there are
For i = 1 To totalNames
uniqueName = Cells(i, 17).Value 'Get the unique name to check for in each column
replaceString = uniqueName 'Start off the "answer" with the unique name
For Each cel In Range(Cells(2, 1), Cells(lastRow, lastHeadCol)) ' for each cell in the range, starting at A2
If cel.Value = uniqueName Then 'If that cell's value IS the unique name then
replaceString = replaceString & " " & Cells(1, cel.Column).Value 'add that name to the string
Cells(i, 17).Offset(0, 1).Value = replaceString ' update the "answer"
End If
Next cel
Next i
End Sub
可能存在问题 - 例如,假设你的 URL 块在第 90 行结束,但你在第 99 行中有不相关的数据,它会将范围设置为下降到 99 - 如果是这种情况,您可以将 "lastRow" 更改为
lastRow = cells(1,1).End(xldown).Row
这有帮助吗?
编辑:如果将来您的代码以 O 以外的列结尾,您可以替换“17"s in that code above with "lastHeadCol + 2”。 VBA 将获得最后使用的带有 header 的列(比如 E 列,即第 5 列),然后在 G 列(第 7 列,又名 5 + 2)中添加 URL 等。从技术上讲,这是编写代码的更好方法,因为它较少依赖某些东西 "hard-coded"(又名 "magic numbers")。
我制作了一个 VBA 函数,它应该就是这样做的。基于我的其他 function 类似性质。不优雅但能胜任。
Public Function FINDHEADERWHERESUBSTRINGFITS(Target As Range, Condition As String)
Dim rng As Range
NumCols = Target.Columns.Count 'counts how many header values we can choose of
Dim Headers() 'defines separate arrays for headers and values (turned out to be obsolete, see variable x)
ReDim Headers(1 To NumCols)
Dim ValuesArr()
ReDim ValuesArr(1 To NumCols)
HeaderRow = Target.Row 'row in which headers are located
LastRow = HeaderRow + Target.Rows.Count - 1 'last row with values
FirstColumn = Target.Column 'first column with values
LastColumn = FirstColumn + Target.Columns.Count - 1 'last column with values
For k = FirstColumn To LastColumn 'for each column
i = i + 1 'set array position
For Each rng In Range(Cells(HeaderRow, k), Cells(LastRow, k)) 'for each value
If rng.Row <> HeaderRow Then 'I mean value, not header
If InStr(Condition, CStr(rng.Value2)) > 0 Then Headers(i) = Cells(HeaderRow, k).Value2 'if it's a substring of the condition then set the corresponding header
End If
Next
Next
FINDHEADERWHERESUBSTRINGFITS = Replace(Replace(Join(Headers, ","), ",,", ","), ",,", ",")
End Function
返回,逗号*比以往任何时候都多,最终的 URL 查找器**。
*抱歉老兄,你说格式无关紧要
**有限制,请参阅评论
Public Function FINDHEADERWHERESUBSTRINGFITS(Target As Range, Condition As String)
Dim rng As Range
HeaderRow = Target.Row 'row in which headers are located
LastRow = HeaderRow + Target.Rows.Count - 1 'last row with values
FirstColumn = Target.Column 'first column with values
LastColumn = FirstColumn + Target.Columns.Count - 1 'last column with values
NumCols = Target.Columns.Count 'counts how many header values we can choose of
NumCells = Target.Cells.Count - (LastColumn - FirstColumn + 1) 'counts how many URLs we can choose of
Dim Headers() 'defines separate arrays for headers and values
ReDim Headers(1 To NumCols)
Dim ValuesArr()
ReDim ValuesArr(1 To NumCells)
For k = FirstColumn To LastColumn 'for each column
i = i + 1 'set array position
For Each rng In Range(Cells(HeaderRow + 1, k), Cells(LastRow, k)) 'for each value
If rng.Row <> HeaderRow Then 'I mean value, not header
If InStr(CStr(rng.Value2), Condition) > 0 Then
Headers(i) = Cells(HeaderRow, k).Value2 'if it's a substring of the condition then set the corresponding header
j = j + 1 'increases the array position counter by one (not to overwrite the previous entry)
ValuesArr(j) = CStr(rng.Value2) 'inserts URL to array position
End If
End If
Next
Next
FINDHEADERWHERESUBSTRINGFITS = Replace(Replace(Join(Headers, ","), ",,", ","), ",,", ",") & "; " & Replace(Replace(Join(ValuesArr, ","), ",,", ","), ",,", ",")
End Function