2015-03-19 96 views
0

我有點不確定什麼是在Excel中隱藏列的最佳方法。我有一個電子表格,包含當前A到AL列,但人們不斷地向其添加列。在excel中隱藏列

然後我們有幾個用戶組,生產,設計師,銷售,修訂等等。

根據用戶所在的用戶組,我想隱藏與用戶無關的列。

所以我的想法是,我可以添加一個筆記到每個列標題與文本生產,設計師如果該列與這兩個組相關等等。然後在vba中遍歷所有列並隱藏不相關的列。

隱藏的列是容易實現:

With Range("C:C,F:H,S:AC") .EntireColumn.Hidden = true End With

,然後或者在一個隱藏薄片或文本文件中指定組名和用戶名,例如:
設計:金,彼得,凱文
生產:arild,roar

任何想法如何最好地做到這一點?

+0

無論你的建議方案是好的。你期望從我們那裏聽到什麼? – 2015-03-19 11:36:59

+0

如果帶註釋的想法是一個好主意,我該如何循環每個筆記並獲得筆記的價值? – skatun 2015-03-19 11:41:53

+0

此網站是爲編程愛好者。我建議你嘗試一下,並針對你遇到的任何具體問題提出一個新問題。 – 2015-03-19 11:59:45

回答

0

下面是一個示例方法。

說我們保持了一個名爲工作表角色與個人的名字,他們所扮演的角色,並隱藏每個角色列:

enter image description here

下面是一些簡單的代碼:

  1. 獲取名稱
  2. 確定角色
  3. 躲在片列工作表Sheet1


Sub ColumnHider() 
    Dim s1 As Worksheet, s2 As Worksheet 
    Dim uName As String, r1 As Range, r2 As Range, HideC As String 
    Set s1 = Sheets("Sheet1") 
    Set s2 = Sheets("Roles") 

    uName = Application.InputBox(Prompt:="Enter your name", Type:=2) 
    Set r1 = s2.Range("A:A").Find(What:=uName, After:=s2.Range("A1")) 
    role = r1.Offset(0, 1).Value 
    Set r2 = s2.Range("D:D").Find(What:=role, After:=s2.Range("D1")) 
    HideC = r2.Offset(0, 1).Value 
    s1.Cells.EntireColumn.Hidden = False 
    s1.Range(HideC).EntireColumn.Hidden = True 
End Sub 

你會添加一些錯誤處理代碼。你可能會考慮讓使用ENVIRON名稱(「用戶名」)

+0

感謝Gary和@ jean-françois-corbett,在我的例子中,我有大約50個用戶,而且由於excel電子表格仍在開發中,並且所有這些用戶仍在向電子表格添加列,所以我無法使用:Manager:C:C從那時起,當在B:B處插入新列時,將會有很多工作來更新所有列引用。所以我想知道要在用戶組的每列上添加一個註釋,還是要在其中列出所有列標題與各個用戶組的列表。哪種方法最好? – skatun 2015-03-20 06:46:16

1

我是復活節假期,感謝你的幫助我解決了這個問題後面,

它在過濾器中定義的表,基於列表中可用的列。它將數據保存在字典中,以便用戶將列添加到列表表單中並不重要。以下是其他人可能覺得有用的代碼。

Sub filterCreation() 

Dim lColumn As Long 
rowHeader = 2 ' HEader row in list sheet 
rowHeader2 = 1 'header row in filter sheet 

Set ws = ThisWorkbook.Sheets("List") 
Set ws2 = ThisWorkbook.Sheets("Filter") 
lColumn = ws.Cells(rowHeader, Columns.Count).End(xlToLeft).column 
Set columnHeader = CreateObject("Scripting.Dictionary") 
Set filterDict = CreateObject("Scripting.Dictionary") 
Dim temp() As Variant 

lRow = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row 

For i = rowHeader2 To lRow 
lcolumn2 = ws2.Cells(i, Columns.Count).End(xlToLeft).column 
If lcolumn2 > 1 Then 
    ReDim temp(lcolumn2 - 2) 

    For j = 2 To lcolumn2 
     temp(j - 2) = ws2.Cells(i, j) 
    Next j 

    Else 
     temp = Array(Empty) 
    End If 

    filterDict.Add CStr(ws2.Cells(i, 1).Value), temp 

Next i 


tempCol = ws2.Cells(1, Columns.Count).End(xlToLeft).column 
ws2.Range(ws2.Cells(rowHeader2 + 1, 1), ws2.Cells(lRow, tempCol)).Clear 


'Refill the sheet 
For i = 1 To lColumn 
'columnHeader.Add ws.Cells(rowHeader, i), "" 

If filterDict.Exists(CStr(ws.Cells(rowHeader, i).Value)) Then 
    b = filterDict.Item(CStr(ws.Cells(rowHeader, i).Value)) 

    For k = LBound(b) To UBound(b) 
     ws2.Cells(rowHeader2 + i, k + 2).Value = b(k) 
    Next k 
End If 

'column header to excel sheet 
ws2.Cells(rowHeader2 + i, 1).Value = ws.Cells(rowHeader, i).Value 

Next i 



'Set columnHeader = Nothing 
Set filterDict = Nothing 

End Sub 

另外我也會自動添加按鈕,列表表激活過濾器:

Sub CreateButtons() 
'On Error Resume Next 

Set ws2 = ThisWorkbook.Sheets("Filter") 
Set ws1 = ThisWorkbook.Sheets("List") 

For Each wShape In ws1.Shapes 
    wShape.Delete 
Next wShape 

rowHeader2 = 1 
lcolumn2 = ws2.Cells(rowHeader2, Columns.Count).End(xlToLeft).column 

tempName = "All" 
ws1.Buttons.Add(20, 20, 81, 36).Name = tempName 
ws1.Shapes(tempName).OnAction = "Unhide_All_Columns" 
ws1.Shapes(tempName).Placement = xlFreeFloating 
ws1.Shapes(tempName).Select 
Selection.Characters.Text = "All" 


tempName = "ShowGUI" 
ws1.Buttons.Add(120, 20, 81, 36).Name = tempName 
ws1.Shapes(tempName).OnAction = "loadGUI" 
ws1.Shapes(tempName).Placement = xlFreeFloating 
ws1.Shapes(tempName).Select 
Selection.Characters.Text = "Show GUI" 


For i = 2 To lcolumn2 
    tempName = CStr(ws2.Cells(rowHeader2, i).Value) 
    ws1.Buttons.Add(15 + i * 100, 20, 81, 36).Name = tempName 
    ws1.Shapes(tempName).OnAction = "Tester" 
    ws1.Shapes(tempName).Placement = xlFreeFloating 
    ws1.Shapes(tempName).Select 
    Selection.Characters.Text = tempName 
    'ws2.Shapes(tempName).Characters.Text = CStr(ws2.Cells(rowHeader2, i).Value) 
Next i 
End Sub 

Filter

List