2014-01-08 188 views
2

我在VBA中很新,並且一直在尋找可以做我想做的事情的VBA代碼。我試了幾次,試圖調整他們,但我似乎無法讓他們正確的想所以我想嘗試一些幫助!根據單元格中的單詞隱藏excel中的行

我有6個項目在其旁邊的單元格中顯示YES或NO,表示該人員是否在處理該項目。這是由另一張工作表上該項目旁邊的人員名稱確定的,因此生成的是公式,而不是下拉式或鍵入的值。

該項目下面有幾行對應於它。

如果項目旁邊有一個NO(在C6中),我希望該項目的相應行被隱藏(行13:29)。

我想這要反覆對每一個項目,

所以C7無隱藏31:47, 一個沒有在C8隱藏49:65, 一個沒有在C9隱藏67:83, 一沒有在C10隱藏85:101, 在C11無隱藏103:118,

我不知道這是可能的,在圈子裏已經繞來繞去,真的希望有人能幫助:)

這是我嘗試過的適應症之一,但我相信我做錯了什麼,抱歉沒有發佈前

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Address = "$C$6" Then 
If Target.Value = NO Then 
Rows(13:29).EntireRow.Hidden = True 
Else 
Rows(13:29).EntireRow.Hidden = False 

If Target.Address = "$C$7" Then 
If Target.Value = NO Then 
Rows(31:47).EntireRow.Hidden = True 
Else 
Rows(31:47).EntireRow.Hidden = False 
End If 
End If 


If Target.Address = "$C$8" Then 
If Target.Value = NO Then 
Rows(49:65).EntireRow.Hidden = True 
Else 
Rows(49:65).EntireRow.Hidden = False 
End If 
End If 

If Target.Address = "$C$9" Then 
If Target.Value = NO Then 
Rows(67:83).EntireRow.Hidden = True 
Else 
Rows(67:83).EntireRow.Hidden = False 
End If 
End If 


If Target.Address = "$C$10" Then 
If Target.Value = NO Then 
Rows(85:101).EntireRow.Hidden = True 
Else 
Rows(85:101).EntireRow.Hidden = False 

End If 
End If 



If Target.Address = "$C$11" Then 
If Target.Value = NO Then 
Rows(103:119).EntireRow.Hidden = True 
Else 
Rows(103:119).EntireRow.Hidden = False 

End If 
End If 


End Sub 
+1

請向我們展示您的這些改編。 :) – Manhattan

+0

我已經更新了代碼的帖子,對不起之前錯過了 – user3171565

+0

刪除了我的downvote。在我的頭頂上,沒有觸及你的代碼,你有沒有嘗試將'NO'轉換爲''NO''? :) – Manhattan

回答

2

最短代碼在這裏荷蘭國際集團這個我能想到的:

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error Resume Next 
    Dim bHide As Boolean 
    bHide = (InStr(1, Target.Value, "NO", vbTextCompare) > 0) 
    Select Case Target.Address 
     Case "$C$6" 
      Rows("13:29").EntireRow.Hidden = bHide 
     Case "$C$7" 
      Rows("31:47").EntireRow.Hidden = bHide 
     Case "$C$8" 
      Rows("49:65").EntireRow.Hidden = bHide 
     Case "$C$9" 
      Rows("67:83").EntireRow.Hidden = bHide 
     Case "$C$10" 
      Rows("85:101").EntireRow.Hidden = bHide 
     Case "$C$11" 
      Rows("103:119").EntireRow.Hidden = bHide 
    End Select 
End Sub 

請測試。

+0

+1:我做到的確切方式。無需使用'InStr',在編輯工作正常之前進行簡單的布爾檢查。雖然這有一個固有的弱點,我敢肯定,如果這個要求是我認爲的那樣。 – Manhattan

+1

@ BK201:恩,不是我這樣做的,雖然結果是由一個公式產生的,所以'Worksheet_Change'不會工作:) –

+0

@SiddharthRout:正是我爲什麼不能發佈我的。他說'不'也是從某個地方來的。另一個固有的弱點是......如果你同時改變多個單元格,它會拋出錯誤13。在「bHide」行之前添加'On Error Resume Next'似乎是解決方案,但它不會隱藏任何東西。 :) – Manhattan

1

所以在C7一個沒有隱藏31:47,一個沒有在C8隱藏49:65,在C9一個沒有隱藏67:83,一個沒有在C10隱藏85:101,沒有在C11隱藏103: 118,

C11皮革103:118?這不應該是C11隱藏103:119?讓我解釋。

爲了使您的工作變得簡單,您需要找到一個關於代碼進展的趨勢。看到這個分析。

enter image description here

您在6行尋找 「否」,顯示/從13:29行隱藏。同樣,您正在尋找第7行中的「否」,並顯示/隱藏第31:47行。所以如果你注意到那麼就有一種趨勢。該行之間的差異是18。見上面的圖片。如果有一種趨勢,那麼就有循環的可能性!

由於這個簡單的表格,我還可以知道你說的C11 hides 103:118是不正確的,可能是一個錯字。該118必須是119保持這種差異18

所以你的代碼實際上可以凝結成(未測試)

Dim i As Long, StartRow As Long, EndRow As Long 

StartRow = 13 
EndRow = 29 

For i = 6 To 11 
    If UCase(Range("C" & i).Value) = "NO" Then 
     Rows(StartRow & ":" & EndRow).EntireRow.Hidden = True 
    Else 
     Rows(StartRow & ":" & EndRow).EntireRow.Hidden = False 
    End If 
    StartRow = StartRow + 18 
    EndRow = EndRow + 18 
Next i 

接下來的事情是,由於NO's越來越式改變,你會必須使用Worksheet_Calculate而不是Worksheet_Change,直到並且除非公式正在從同一工作表中拾取值,並且更改C6:C11的單元由用戶手動更改。

+0

這種模式很好的選擇!但是如果這個模式被破壞的話,VBA新手很難維護(如果某些「否」需要更多的行來隱藏其他的)。關於Worksheet_Calculate絕對正確。 – PatricK

+0

@PatricK:我們都是新手一次;) –

+0

@SiddharthRout,它工作!非常感謝您的幫助!我不可能通過自己想出這個代碼來解決它,希望我不會破壞它!,非常感謝所有花時間幫助我的人:) – user3171565

相關問題