【问题标题】:BASIC nested loops: filtering rowsBASIC 嵌套循环:过滤行
【发布时间】:2016-04-04 21:28:26
【问题描述】:

我正在使用 LibreOffice Calc 存储 16 种 RGB 颜色(B 列中的红色,C 中的绿色和 D 中的蓝色),然后我想用每种颜色绘制 16 个单元格的背景。每种颜色都在一行中。

目前我已经部分实现了这一点:不仅绘制了 16 个单元格,而且还绘制了 48 个(16x3)!看来我需要“分组”嵌套循环。这是我的代码/宏:

function bgcolor()

Dim Doc, Sheet, CellPaint As Object
Dim CellR, CellG, CellB As String

Doc = ThisComponent
Sheet = Doc.Sheets.getByIndex(0)

For i = 1 to 16 step 1
    For j = 1 to 3 step 1
        CellR = Sheet.getCellByPosition(j+0,i).getValue()
        CellG = Sheet.getCellByPosition(j+1,i).getValue()
        CellB = Sheet.getCellByPosition(j+2,i).getValue()
        CellPaint = Sheet.getCellByPosition(j+6,i)
        CellPaint.CellBackColor = RGB(CellR,CellG,CellB)
    next j
next i

bgcolor=CellPaint.CellBackColor

end function

这是结果:

第一列颜色 (H) 正是我需要的。其他两列出现在那里,所以:如何修复我的嵌套循环?可能我需要使用简单的if 语句过滤它们,但我不确定。

编辑 - 供参考:解决方案应该类似于this one,但是我已经读过它在 OpenOffice 上是不可能的(我假设在 LibreOffice 上都不是)。

谢谢!

【问题讨论】:

    标签: basic


    【解决方案1】:

    只需放下内循环——不需要水平迭代:

    function bgcolor()
    
      Dim Doc, Sheet, CellPaint As Object
      Dim CellR, CellG, CellB As String
    
      Doc = ThisComponent
      Sheet = Doc.Sheets.getByIndex(0)
    
      For i = 1 to 16 step 1
        CellR = Sheet.getCellByPosition(1,i).getValue()
        CellG = Sheet.getCellByPosition(2,i).getValue()
        CellB = Sheet.getCellByPosition(3,i).getValue()
        CellPaint = Sheet.getCellByPosition(7,i)
        CellPaint.CellBackColor = RGB(CellR,CellG,CellB)
      next i
    
      bgcolor=CellPaint.CellBackColor
    
    end function
    

    【讨论】:

    • 效果很好!我没想到会这么容易。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2015-06-05
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多