使用VBA将excel单元组织成“稀疏矩阵”

时间:2014-09-18 13:09:07

标签: excel vba excel-vba

我有一些Excel工作表填充了翻译键值对。它包含以下列:版本 langcode ,它们如下所示:

2.2 | en-GB | label_yes | Yes.
2.2 | de-DE | label_yes | Ja.
2.2 | de-DE | label_no  | Nein.

并非所有标签都翻译为所有语言,并且某些翻译不止一次出现。要检查它,我需要一个2D数组,其中行是键,列是语言代码,值是值(所以有点像数据透视表,但是实际值而不是Sum / Count / Avg),如下所示:

          | en-GB | de-DE
label_yes | Yes.  | Ja.
label_no  |       | Nein.

语言和标签都没有预定义(每个文件有4700个键值对)所以我不能制作一张包含所有可能值和一些VLOOKUP / HLOOKUP / INDEX / etc魔法的工作表。相反,我可能需要一个处理原始(输入)工作表的VB宏,如下所示:

  • 如果当前行中的语言代码在新(输出)工作表中尚不存在,请将其复制到第一行中的第一个可用位置(B1 ,C1,D1等)
  • 如果当前行中的在新(输出)工作表中尚不存在,请将其复制到第一列中的第一个可用位置(A2, A3,A4等)
  • 找到语言代码的列和当前行的行并复制(第四行的内容)细胞)到适当的位置

不幸的是,这超过了我几乎不存在的VBA技能。任何人都可以提供一些指示从哪里开始? "如何处理未知长度的列表"并且"检查该值是否已经在给定的行/列中#34;部分有点朦胧(我认为我可以复制一个单元格... VBA不是我的强项。:()。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

你可以从类似的东西开始:

Dim Lan(1 To 5) As String
Dim Value(1 To 1000, 0 To 10) As String
Dim e As Integer
Dim Tmp, Tmp1 As String

Range("F1:M10").ClearContents
e = 1
For i = 2 To 9999
    Tmp = Cells(i, 3).Value
    If Tmp = "" Then Exit For
    tr = False
    For k = 1 To e
        If Tmp = Value(k, 0) Then
            tr = True
            Exit For
        End If
    Next

    tr1 = False
    Tmp1 = Cells(i, 2).Value
    For m = 1 To 5
        If Tmp1 = Lan(m) Then
            tr1 = True
            Exit For
        End If
        If Lan(m) = "" Then Exit For
    Next

    If tr1 = False Then
        Lan(m) = Tmp1
    End If

    If tr Then
        Value(k, m) = Cells(i, 4)
    Else
        Value(e, m) = Cells(i, 4)
    End If

    If tr = False Then
        Value(e, 0) = Tmp
        e = e + 1
    End If
Next

For k = 1 To 5
    Cells(1, 6 + k).Value = Lan(k)
Next
For i = 1 To e
    Cells(i + 1, 6).Value = Value(i, 0)
    For k = 1 To 5
        Cells(i + 1, 6 + k).Value = Value(i, k)
    Next
Next

内置Matrix,并重新进行重建。