将每一列中的数字更改为每一列标题的子字符串

时间:2018-08-09 19:13:30

标签: excel vba excel-vba excel-formula

使用Excel,我正在尝试完成以下任务:

之前和之后的样本
Sample of before & after

我需要将所有的1转换为每列的相应国家/地区名称。对于像上面的示例这样的小型数据集,手动进行起来很容易,但是当我有196列x 2个数据集时,就不那么容易了。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

复制工作表并清除除第二个工作表中的标题以外的所有值。在第二页的标题行以外的每个对应的单元格中,添加以下公式。

=IF(INDIRECT(ADDRESS(ROW(),COLUMN(),1,1,"Sheet1"),TRUE)=1,
    MID(INDIRECT(ADDRESS(1,COLUMN())),
        FIND("[",INDIRECT(ADDRESS(1,COLUMN())))+1,
        FIND("]",INDIRECT(ADDRESS(1,COLUMN())))-
            FIND("[",INDIRECT(ADDRESS(1,COLUMN())))-1),"")

然后可以复制第二张纸的相应单元格。过去的值进入第一张纸。完成了。

{您将要从公式中删除回车符。另外,您可能想删除第二张纸来隐藏魔术。 :-)}

答案 1 :(得分:0)

如果您愿意使用vba而不是公式,那么我认为这对您有用。它在"A:F"中查找非空单元格,并在[...]

中获取这些单元格的名称。
Sub AdjustName()

    Dim cell As Range
    For Each cell In Range("A2:F" & LastRowInRange_Find(Range("A:F")))
        If Len(cell.Value2) > 0 Then
            With Cells(1, cell.Column)
                cell.Value2 = Mid(.Value2, InStr(.Value2, "[") + 1, Len(.Value2) - 1 - InStr(.Value2, "["))
            End With
        End If
    Next cell

End Sub


Function LastRowInRange_Find(ByVal rng As Range) As Long

    'searches range from bottom up looking for "*" (anything)
    Dim rngFind As Range
    Set rngFind = rng.Find( _
                            What:="*", _
                            After:=Cells(rng.row, rng.Column), _
                            LookAt:=xlWhole, _
                            LookIn:=xlValues, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious)

    If Not rngFind Is Nothing Then
        LastRowInRange_Find = rngFind.row
    Else
        LastRowInRange_Find = rng.row
    End If

End Function