Excel 基于编号的轮廓将字符从单元格移动到新单元格

Excel 基于编号的轮廓将字符从单元格移动到新单元格,excel,excel-formula,vba,Excel,Excel Formula,Vba,我在Windows 7上运行Office Professional Plus 2013。具有下图所示的矩阵 矩阵数据可在本文件中找到 以下是关于矩阵的两个事实: 列A是一个数字轮廓,轮廓级别从1到13不等 大纲编号按顺序排列 以下是矩阵组织方式的说明: A4(轮廓级别2)在M4中有一个支架,其中M列(标记为“L-02”)对应于轮廓级别2 A16(轮廓级别6)在I6(眼睛6)中有一个括号,其中I列(标记为“L-06”)对应于轮廓级别6 A7(轮廓级别5)在J7中没有括号,其中J列(标记为“L-0

我在Windows 7上运行Office Professional Plus 2013。具有下图所示的矩阵

矩阵数据可在本文件中找到

以下是关于矩阵的两个事实:

  • 列A是一个数字轮廓,轮廓级别从1到13不等
  • 大纲编号按顺序排列
  • 以下是矩阵组织方式的说明:

  • A4(轮廓级别2)在M4中有一个支架,其中M列(标记为“L-02”)对应于轮廓级别2
  • A16(轮廓级别6)在I6(眼睛6)中有一个括号,其中I列(标记为“L-06”)对应于轮廓级别6
  • A7(轮廓级别5)在J7中没有括号,其中J列(标记为“L-05”)对应于轮廓级别5
  • 在编写公式或VB脚本时需要以下帮助:

  • 对于带括号的轮廓级别柱
  • 查找下一行,其中列A中的大纲的位置数小于或等于当前大纲级别的位置数
  • 然后将括号从大纲列中的当前单元格移动到要查找的解决方案之前的同一列中的单元格
  • 例如,请看第16行。需要:

  • 查找A16位置数小于或等于A16位置数的下一行。 该行是21,因为FIND将标识一个单元格(A21),该单元格的位置数少于A16中的位置数
  • 接下来,后退一行
  • 然后,将支架从I16(眼睛16;轮廓级别6)移动到I20
  • 图中的黄色单元格是列中的括号必须移动到的单元格示例

    如何在Excel中完成此操作?

    问我任何关于#1-#11的问题。例如,是否可以更改大纲编号方案以使其更易于解析和比较?是的,小数可以去掉


    谷歌电子表格中,一组带有红色“x”的单元格样本表示括号应移动到的位置。

    我认为您应该找到括号所在的列。然后定义一个数组,该数组从同一行开始,从找到的+1列开始。所以在你第16排的情况下。它应该从数据集右下边界的J16开始(图中为O36)。 然后搜索第一次遇到括号时,可以在行数上使用for循环,在列上嵌套for循环,并在其中嵌套if语句。然后,在标识该行时,可以使用单元格将括号复制到新单元格中

    我几周前才开始写脚本,所以我无法精确地编写这段代码。但它看起来像这样

    DIM Array as string
    DIM totalrows as Thisworkbook.thisworkseet.count.rows
    
    FOR rows x to totalrows
     FOR column X to totalcolumns
      IF cells(row,col) = Cells(cell you are looking up)
        THEN
         Cells (cell you are looking up) = (row -1, col) 
         Exit FOR
        End if
       Next column
      Next row
    

    如果我理解算法,你可以用公式来解。以下是我的结果:

    P2
    (向下拖动以填充列)中的公式为:

    它计算当前大纲中
    的数量(在某些情况下,您有
    而不是
    ,因此您应该先使用
    替换所有
    来修复它)

    范围
    Q1:AD1
    包含级别编号

    Q2
    中的公式(用它填充整个范围):

    它检查当前级别是否高于下一级别,并显示从(下一行级别+1)到(当前行级别)的级别的括号


    您的示例和我的结果之间的唯一区别在于
    L10
    单元格,但我认为
    L9
    中的括号应该根据您的算法移动到
    L10
    (而不是
    L11
    );我会试验并告诉你结果。不客气。也许还有一些人能够从头开始编写此代码,因此有了一个更简单的解决方案。在您的示例表中:
    L11
    中的
    x
    标记不应该放在
    L10
    中吗?如果您指的是第694行,答案是否定的。原因:694是693的孩子。此外,694有4个子节点,但它们是层次结构这一部分中的终端节点,这意味着它们没有子节点。同样的条件也适用于697。列
    L-11
    x
    的平衡是正确的。我指的是单元格
    L11
    L10
    ,因此将
    x
    从第11行向上移动一行。不,因为轮廓指示下一行是子行,因此是更深层次的(即上一层次+1)您的描述表明我们应该从
    L9
    中取括号,找到第一个较短或相等的行(L11),返回一行(L10),然后将括号放在那里。那么为什么它在L11?TX中呢?我现在就来试试这个。我已经将
    LEN
    设置为与您的图像等效。已将
    IF
    公式复制到
    Q2
    。但是,当我将
    Q2
    复制到范围(Q-AD和结束行)中的单元格的平衡时,我没有得到我在图像中看到的括号。我做错了什么?@Jay Gray你能把它添加到你的谷歌表单样本中吗?我可以看看用户的错误!我成功地复制了你的结果。现在让我看看你发现的可能的错误。太棒了。我现在看到了手动练习中的错误。仅供参考,您的解决方案是在Excel中自动构建JSON数据结构。这将节省我的工作时间,并消除错误。我需要一段时间将Excel结构转换为JSON,然后对其进行测试。如果我遇到我无法处理的问题,我会回到你身边。ITMT,非常好的解决方案-没有VB!
    =LEN(A2)-LEN(SUBSTITUTE(A2,".",""))
    
     =IF(AND($P2>$P3,MEDIAN($P2,$P3+1,Q$1)=Q$1),"]","")