簡體   English   中英

Excel條件格式公式和范圍(VBA)

[英]Excel Conditional formatting formula and ranges (VBA)

我有一個FormatCondition 我正在閱讀.Formula1.AppliesTo

我想查找公式是否包含將在AppliesTo指定的范圍內變化的單元格引用,例如CNO C3:D10范圍內的=NOT(ISNUMBER(C3))

據我所知,該引用可能是相對的(例如C3 )或混合的(例如$C3C$3 ),但不是絕對的。 根據https://www.ablebits.com/office-addins-blog/2014/08/07/relative-absolute-cell-references-excel-,它也將是“應用范圍中最左上角的單元格” 條件格式/和其他一些網站。

如果范圍是C3:D10 ,那很容易。 使用myRange.Cells(1, 1)查找左上角myRange.Cells(1, 1)使用.Address或類似名稱將其轉換為字符串,然后在公式中查找該字符串,以及添加$相關變體。 當然,我必須注意類似字符串的事情(例如,左上方的單元格為C3' and formula is =“ CC3NE”`),但有可能(仍然,我歡迎提出有關如何更好地做到這一點的建議,但這不是問題)。

真正的問題是范圍是否更復雜(如條件格式設置經常發生的那樣)。 例如$CQ$39:$FT$39,$BE$39,$BE$8:$BE$9,$CU$8:$FT$9,$CU$12:$FT$14,$BE$12:$BE$14,$BE$16:$BE$30,$CQ$16:$FT$30,$CQ$32:$FT$36,$BE$32:$BE$36 .Cells(1, 1)不能給出正確的答案( BE8 ,根據Excel制定的公式)。

此外,如果范圍是$A$5,$E$1 -沒有“左上方”怎么辦? 那么,excel(或用戶)如何確定公式中應該包含哪些內容?

因此,主要的問題是: Excel確定在公式中使用哪個單元格的系統什么,因為我不認為它是“左上角”的-它可能是“查找最上面的行,然后找到那里的最左邊的單元格” ,或者相反,或者完全不同。

第二個問題是: 如何最好地找到給定范圍內的那個細胞?

額外的問題(如果在這里沒有得到回答,我很高興)是: 有一種好的方法可以在公式中查找對該單元格的引用,包括該單元格的相對和混合版本嗎?

請注意,這些奇怪的范圍來自使用條件格式在工作表上剪切和粘貼的行和列,而Excel則將條件格式切碎(更改范圍和更改公式,這兩種操作都無需用戶輸入)。 因此,在這種情況下,優先考慮的是處理將Excel自行設置公式的任何事情,不一定是用戶可能會做的事情-但同時處理兩者會更好。

第一個答案 :簡短版本:Excel確實的確使用了最左上角的單元格-但是即使該單元格不在該范圍內,它也會這樣做

我創建了一張空白紙,選擇了A5,E1 ,並以條件格式為NOT BLANK(Excel使用公式對其進行了處理)。 Excel創建了以下內容:

范圍: $E$1,$A$5

公式: =LEN(TRIM(A1))>0

因此,即使A1不在范圍內,這也是公式中使用的內容。

我通過在工作表周圍復制來進行檢查,並保持一致。

因此,Excel在范圍內找到最左邊的列,在范圍內找到最上面的行,並將它們合並以生成應被視為范圍“左上角”的單元格,即使所得單元格實際上不是范圍的一部分。

這也暗示了第二個問題的答案:找到范圍中最上面的行; 找到最左邊的列; 然后使用將兩者結合起來的單元格與公式進行比較。 您可以通過遍歷范圍字符串來做到這一點,或者遍歷范圍本身來逐個單元; 也許有更好的方法可以做到(歡迎提出建議)。

它雖然不漂亮,但如果我能找到一種很好的方法來完成這兩件事,那它就會起作用。

我仍然歡迎您:

  • 任何人都可以改進此公式中有關在公式中使用哪個單元格的答案(我沒有對此進行廣泛的測試)
  • 任何可以建議找到上述“左上方單元格”的好方法的人
  • 任何可以建議一種在公式字符串中搜索左上方單元格的好方法的人

編輯-這是Usmanhaq的出色方法的替代代碼方法-這作為字符串遍歷整個范圍:

Private Function FindTopLeft(rangeStr As String, rowabs As Boolean, colabs As Boolean) As String
    newRange = Replace(rangeStr, ":", ",")
    newRangeArray = Split(newRange, ",")
    Dim lowestRow As Long
    Dim lowestCol As Long
    lowestRow = 2147483647
    lowestCol = 2147483647

    For Each cell In newRangeArray
        cell = Trim(cell)
        If cell <> "" Then
            cCol = range(relativeCell).Column
            cRow = range(relativeCell).Row
            If cCol < lowestCol Then lowestCol = cCol
            If cRow < lowestRow Then lowestRow = cRow
        End If
    Next

    FindTopLeft = Cells(lowestRow, lowestCol).Address(rowabs, colabs)

End Function

感謝您更新您的問題並在我的評論下方找到

Excel確定在公式中使用哪個單元格的系統是什么,因為我不認為它是“左上角”的-它可能是“查找最上面的行,然后找到最左邊的單元格”,或者它可能是反向,或完全不同的東西。

通常,Excel中的范圍類似於具有固定長度和寬度的框或矩形,例如B3:C8。 在這種簡單的框類型范圍的情況下,最左上角的單元格是條件格式中所有公式的基礎。 換句話說,在第一次公式評估時,將根據條件格式中應用的公式檢查此單元格的值。 (我們稱此單元為母單元)

例如

  • 如果將條件格式應用於單元格A1:D10並且條件公式為B2> 0,則意味着如果B2> 0,則將格式應用於單元格A1;對於其他單元格,如果偏移量為的單元格將格式應用於任何單元格(1,1)(在A1情況下為B2)的值大於0。即,對於B2的格式,將檢查C3的值。
  • 如果將條件格式應用於單元格A1:D10並且條件公式為AND($ B1> = 30,$ B1 <= 60),則意味着如果condition的值為true,則將格式應用於單元格A1,但是現在有所不同,因為由於$ B,B現在是靜態的,對於B2的條件格式,條件將再次為AND($ B1> = 30,$ B1 <= 60)對於C1和D1相同,但是對於A2,B2,C2和D2是AND($ B2> = 30,$ B2 <= 60)

在第一種情況下,第一個根據公式檢查的單元格為A1,甚至在第二種情況下,根據條件公式檢查的單元格為A1(我們稱為母單元格)

現在,如果該范圍不像一個框,則它是一個用逗號分隔的混合范圍,即使在這種情況下,即使我們圍繞該范圍創建一個框,其母單元格也是左上角的單元格,也不是該單元格的第一個單元格。范圍,但框的第一個單元格。

對於第二個問題,我如何才能最好地找到給定范圍內的那個單元格?

如果您想在像簡單范圍之類的框中找到母單元,那就是單元(1,1)

如果要查找混合范圍內的單元格,可能有一些功能,但我不知道。 我會通過使用下面的循環來找到

Sub find_topleft()

 Dim r, full_range As Range

 Set r = Range("$O$8:$O$17,$Q$4:$Q$13,$S$4:$S$6")

 Set full_range = Sheets("Sheet1").UsedRange

 row_num = full_range.Rows.Count + full_range.Row - 1
 col_num = full_range.Columns.Count + full_range.Column - 1

 For Each c In r
    If c.Row < row_num Then
    row_num = c.Row
    End If

    If c.Column < col_num Then
    col_num = c.Column
    End If
 Next

 Debug.Print row_num
 Debug.Print col_num

End Sub

有什么好方法可以在公式中查找對該單元格的引用,包括該單元格的相對版本和混合版本嗎?

如您對第一個問題的回答所述,該單元格直接與公式鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM