سؤال

يقوم عامل التصفية التلقائي بفرز البيانات عموديًا، ولكنني أريد تصفية الصفوف أفقيًا.لنفترض أن لدي الجدول التالي:

1 2 2 1 2

ب أ ه ف ف

ب د ه ف ف

ج د ه ف ف

ما يمكنني فعله هو تعيين عامل تصفية تلقائي وتصفية الصفوف التي تحتوي على "B" في العمود الأول فقط.ما أود فعله هو تصفية الصفوف التي تحتوي على "2" فقط (في هذه الحالة تكون الصفوف هي الثانية والثالثة والأخيرة في هذه الحالة).

لقد وجدت بعض المعلومات حول هذا الموضوع.تحتوي جميع الإجابات التي وجدتها على بعض وحدات الماكرو لإنجاز المهمة، ولكنها مكتوبة لبرنامج MS Excel، وهي غير متوافقة مع OpenOffice

على سبيل المثال، يجب أن تقوم وحدات الماكرو هذه بتصفية الصفوف، ولكنها لا تعمل في OpenOffice Calc:

Option Explicit

Sub horizontal_filter()
'Erik Van Geit
'060910

Dim LC As Integer           'Last Column
Dim R As Long
Dim i As Integer
Dim FilterValue As String

Const FilterColumn = 1      '1 is most logical value but you may change this

R = ActiveCell.Row
LC = Cells(R, Columns.Count).End(xlToLeft).Column

FilterValue = Cells(R, FilterColumn)

Application.ScreenUpdating = False

'to filter starting after FilterColumn
For i = FilterColumn + 1 To LC
'to filter all columns even before the filtercolumn
'For i = 1 To LC
    If i <> FilterColumn Then
    Columns(i).Hidden = Cells(R, i) <> FilterValue
    End If
Next i

Application.ScreenUpdating = True

End Sub

أي مساعدة يحظى بتقدير كبير!

هل كانت مفيدة؟

المحلول

لا يمكنك ذلك، على افتراض وجود نفقات معقولة.من الأسهل بكثير تحويل بياناتك بحيث تحصل الصفوف على أعمدة والعكس صحيح.لذا، أوصي بشدة بتحويل البيانات باستخدام Paste Special جنبا إلى جنب مع Transpose خيار.يمكنك أيضًا القيام بذلك ديناميكيًا باستخدام TRANSPOSE() وظيفة.

يحرر:

الآن فهمت - أنت تريد ذلك إخفاء الأعمدة على أساس قيمة معينة.هذا ممكن باستخدام ماكرو في الواقع، لذلك كانت إجابتي الأولى غير صحيحة - آسف لذلك!هناك بعض وحدات الماكرو التي ستفعل ذلك نيابةً عنك.يمكنك الجمع بين هذا الحل ومرشح تلقائي.وهنا أ الحل بواسطة King_026 من منتديات OpenOffice.org (متكيف قليلاً مع بنية الجدول - انظر أدناه):

REM  *****  BASIC  *****
sub hide
   rem ----------------------------------------------------------------------
   rem define variables
   dim document   as object
   dim dispatcher as object
   rem ----------------------------------------------------------------------
   rem get access to the document
   document   = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

   rem get the current column
   nCol = ThisComponent.CurrentSelection.CellAddress.Column

   rem set the properties for moving right
   dim args2(1) as new com.sun.star.beans.PropertyValue
   args2(0).Name = "By"
   args2(0).Value = 1
   args2(1).Name = "Sel"
   args2(1).Value = false

   rem make thecurrent column counter
   dim cCol as integer
   CCol = 0

   rem goto the first column
   dim args1(0) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "ToPoint"
   args1(0).Value = "$A$2"

   dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

   rem loop until you get back to the selected cell
    Do Until cCol > nCol

    rem hide if the cell value is 1
        if ThisComponent.CurrentSelection.string <> "" and ThisComponent.CurrentSelection.value = 1 then

            rem ----------------------------------------------------------------------
            dispatcher.executeDispatch(document, ".uno:HideColumn", "", 0, Array())

        End if

        rem goto the right nad increment the column counter
        dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())
        cCol = cCol + 1

    Loop

End sub

إذن الجدول التالي:

calc1

سيبدو هكذا بعد التصفية التلقائية في Col1 وبعد قيام الماكرو بعمله:

calc

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top