اذهب الي المحتوي
أوفيسنا

Saleh Ahmed Rabie

02 الأعضاء
  • Posts

    96
  • تاريخ الانضمام

  • تاريخ اخر زياره

  • Days Won

    3

مشاركات المكتوبه بواسطه Saleh Ahmed Rabie

  1. 11 دقائق مضت, مصطفى العراقي1988 said:

    السلام عليكم ورحمة الله وبركاته 

     

    الرجاء مطلوب حساب المدة يوم وشهر وسنة في حقل واحد 

     

    ولكن بتاريخ معين ومتغير 

     

     

    مسودة.xlsx 13.22 kB · 1 download

    وعليكم السلام ورحمة الله وبركاته

    يمكنك استخدام الدالة التالية في خلية E2:

    =DATEDIF(TODAY(),DATE(سنة المعينة, شهر المعين, يوم المعين),"d")

    حيث تقوم هذه الدالة بحساب عدد الأيام بين تاريخ اليوم وتاريخ المعين الذي تحدده في الصيغة. يمكنك استبدال "سنة المعينة" و"شهر المعين" و"يوم المعين" بالقيم المعينة التي تريدها.

    • Like 1
  2. في 5‏/6‏/2024 at 14:37, ضياء 2 said:

    السلام عليكم الاساتذة الافاضل بالمنتدى فضلا من كرمكم " الدالة توجد في عمود E عمل الدالة اذا كان رصيد في عمود  C اكبر من صفر تقوم بعملية ضرب الرصيد * عمود D سعر قيمة الخلية إلى أعلى صف واحد واذا كانت غير ذلك القيمة تكون القيمة صفر   المطلوب جلب سعر قيمة الخلية إلى أعلى بشرط عمود A التاريخ السابق ، وعمود B الاسم   "

    ورقه.xlsx 11.34 kB · 4 downloads

    وعليكم السلام ورحمة الله وبركاته

    يمكنك استخدام الصيغة التالية في الخلية E2:

    =IFERROR(IF(AND(C2>0, A2=0, B2="اسم المطلوب"), IF(ROW(C2)=2, C2*D2, OFFSET(D2, -1, 0)*C2), 0), 0)

    هذه الصيغة ستتحقق من أن قيمة في عمود C أكبر من صفر، وأن قيمة في عمود A تساوي صفر (التاريخ السابق)، وأن قيمة في عمود B تساوي "اسم المطلوب". إذا تم تحقيق هذه الشروط، سيتم ضرب قيمة في عمود C بقيمة في عمود D، وإلا ستكون القيمة صفر.

    ويمكنك استخدام الكود التالي في VBA لتنفيذ النفس العملية:

    Sub CalculateValue()
        Dim lastRow As Integer
        Dim i As Integer
        
        lastRow = Cells(Rows.Count, "A").End(xlUp).Row
        
        For i = 2 To lastRow
            If Cells(i, 3).Value > 0 And Cells(i, 1).Value = 0 And Cells(i, 2).Value = "اسم المطلوب" Then
                If i = 2 Then
                    Cells(i, 5).Value = Cells(i, 3).Value * Cells(i, 4).Value
                Else
                    Cells(i, 5).Value = Cells(i - 1, 5).Value * Cells(i, 3).Value
                End If
            Else
                Cells(i, 5).Value = 0
            End If
        Next i
    End Sub

     

    يقوم هذا الكود بتنفيذ العملية المطلوبة في العمود E بناءً على شروط معينة في الأعمدة A، B و C. يمكنك تشغيل هذا الكود في VBA Editor في Excel عن طريق الضغط على Alt + F11 ولصق الكود في نافذة الكود الخاصة بالورقة التي ترغب في تطبيق العملية عليها، ثم تشغيل الكود.

     

     

     

    • Like 1
    • Thanks 1
  3. 11 دقائق مضت, عمر المختار 1 said:

    بحثت عن الدالة datedif لحساب فرق بين تاريخين - في اكسيل 2019 لم اجدها

    هل هناك دالة اخرى حلت محلها . لحساب الفرق بين تاريخين باليوم و الشهر و السنة

     

    يمكنك استخدام الكود التالي في VBA لحساب الفرق بين تاريخين بالأيام والشهور والسنوات ويمكن استخدامه في جميع إصدارات Excel:

    Function DateDiffInDays(startDate As Date, endDate As Date) As Integer
        DateDiffInDays = DateDiff("d", startDate, endDate)
    End Function
    
    Function DateDiffInMonths(startDate As Date, endDate As Date) As Integer
        DateDiffInMonths = DateDiff("m", startDate, endDate)
    End Function
    
    Function DateDiffInYears(startDate As Date, endDate As Date) As Integer
        DateDiffInYears = DateDiff("yyyy", startDate, endDate)
    End Function

     

    يمكنك استخدام هذه الدوال في الصيغ الخلية كما يلي:

    - لحساب الفرق بالأيام بين تاريخي A1 و B1: =DateDiffInDays(A1, B1)
    - لحساب الفرق بالشهور بين تاريخي A1 و B1: =DateDiffInMonths(A1, B1)
    - لحساب الفرق بالسنوات بين تاريخي A1 و B1: =DateDiffInYears(A1, B1)

    أتمنى أن يكون هذا الكود مفيدًا لك.

    • Like 1
  4. في 8‏/6‏/2024 at 22:27, abouelhassan said:

    السلام عليكم اخوانى 

    لدى داتا كبيرة بها ارقام مثال 

     

    894.48

    ٢٦١٥٫٣٥

    الرقم الاول

     رفم اما الثانى فهو نص اقوم بنسخ الفواصل من الرقمين واستبدل الفاصلة الثانية بالاولى لتحويل الارقم ل ارقم بدل من نص حاولت تسجيل ماكرو وفشل مش عارف ليه احتاج لكود تحويل الكل

    على فرض ان الارقام تكمن فى العمود D من D2:D50000

    مع خالص الشكر والتقدير

    الارقام والنصوص.xlsx 8.67 kB · 1 download

    وعليكم السلام ورحمة الله وبركاته

    يمكنك استخدام الكود التالي في VBA لتحويل الأرقام من النص إلى أرقام:
     

    Sub ConvertTextToNumber()
        Dim cell As Range
    
        For Each cell In Range("D2:D50000")
            If IsNumeric(cell.Value) Then
                cell.Value = CDbl(cell.Value)
            Else
                cell.Value = CDbl(Replace(cell.Value, ",", ""))
            End If
        Next cell
    End Sub

     

    يقوم هذا الكود بالتحويل التالي:
    1. يتحقق مما إذا كانت القيمة رقمية، إذا كانت رقمية فإنه لا يقوم بتغييرها.
    2. إذا لم تكن القيمة رقمية، يقوم بإزالة الفواصل الزائدة وتحويل النص إلى رقم.

    • Like 2
  5. في 7‏/6‏/2024 at 19:55, abdullahsaeed279807 said:

    السلام عليكم اساتذتي الكرام لدي شيت به العديد من المعادلات وحاولت تحويل المعادلات الى اكواد حسب كود الاستاذ القدير عبداللة بقشير لكن عند تنفيذ الكود تطلع لي رسالة خطاء بان الكود طويل جدا

    65851394-A0DD-4037-B9BA-4D51990012BF.png.jpg.975d1961b41ee90f2ac35ceb645422dc.jpg

    وعليكم السلام ورحمة الله وبركاته

    إذا كانت المعادلات في الشيت كبيرة جدًا وتحولها إلى كود VBA ينتج عن ذلك كود طويل جدًا، يمكنك محاولة تقسيم العملية إلى أجزاء أصغر لتجنب رسالة الخطأ بسبب طول الكود. يمكنك تجربة تفعيل ما يلي:

    1. قم بتحديد نطاق من الخلايا المحتوية على المعادلات التي ترغب في تحويلها إلى رموز VBA.
    2. استخدم الكود التالي لتحويل المعادلات في النطاق المحدد إلى رموز VBA:

    Sub ConvertFormulasInRangeToVBA()
        Dim cell As Range
        
        For Each cell In Selection
            If cell.HasFormula Then
                With ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule
                    .AddFromString "Sub ConvertFormula" & cell.Address & "()" & vbNewLine & _
                                   "    Range(""" & cell.Address & """).Value = " & "'" & cell.Formula & "'" & vbNewLine & _
                                   "End Sub"
                End With
            End If
        Next cell
        
        MsgBox "تم تحويل المعادلات في النطاق المحدد إلى رموز VBA بنجاح.", vbInformation
    End Sub

     

    3. بعد تشغيل الكود، حدد النطاق الذي تريد تحويل المعادلات فيه يدويًا، ثم قم بتشغيل الكود.
    4. سيتم تحويل المعادلات في النطاق المحدد إلى رموز VBA في موديول جديد.

    يرجى ملاحظة أن هذه الطريقة لتقسيم العملية قد تساعد في تجنب رسالة الخطأ بسبب طول الكود، وتجعل عملية التحويل أكثر كفاءة.

  6. يمكنك الاستفادة من هذا الكود ليقوم بعرض رسالة تنبيه عند الانتهاء من تحويل المعادلات ونقل الرموز المتولدة إلى موديول بشكل تلقائي:

    Sub ConvertFormulasToVBA()
        Dim ws As Worksheet
        Dim vbComp As Object
        Dim newModule As Object
        Dim cell As Range
        
        Set ws = ThisWorkbook.Sheets("Sheet1")
        
        ' Create a new VBA module
        Set vbComp = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
        Set newModule = vbComp.CodeModule
        
        ' Loop through cells with formulas and add them to the new module
        For Each cell In ws.UsedRange
            If cell.HasFormula Then
                newModule.InsertLines newModule.CountOfLines + 1, "Sub Formula" & cell.Address & "()"
                newModule.InsertLines newModule.CountOfLines + 1, "    Range(""" & cell.Address & """).Value = " & Chr(34) & "'" & cell.Formula & Chr(34)
                newModule.InsertLines newModule.CountOfLines + 1, "End Sub"
            End If
        Next cell
       
        MsgBox "تم تحويل المعادلات إلى كود VBA بنجاح وتم نقل الرموز إلى موديول جديد.", vbInformation
    End Sub


    ```

    عند تشغيل هذا الكود، ستظهر رسالة تنبيه عند الانتهاء من تحويل المعادلات ونقل الرموز إلى موديول جديد. يُفضل تغيير اسم الشيت في السطر العاشر حسب اسم الشيت الذي تريد تحويل المعادلات فيه.

  7. وعليكم السلام ورحمة الله وبركاته

    يمكنك استخدام الكود التالي في VBA لحفظ ملف PDF داخل الفولدر الذي تم اختياره:

    Sub SaveAsPDF()
        Dim FilePath As Variant
        Dim FileName As String
        
        ' اختيار مسار الفولدر
        FilePath = Application.GetSaveAsFilename(FileFilter:="PDF Files (*.pdf), *.pdf", Title:="Save As PDF")
        
        ' التأكد من ان تم اختيار مسار الفولدر وليس الالغاء
        If FilePath <> False Then
            ' استخراج اسم الملف من المسار
            FileName = Dir(FilePath)
            
            ' حفظ الورقة الحالية كملف PDF في المسار المحدد
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePath, Quality:=xlQualityStandard
            MsgBox "تم حفظ الملف بنجاح في الفولدر: " & FilePath
        End If
    End Sub


    ```

    يقوم هذا الكود بفتح نافذة اختيار مسار الفولدر ويسمح للمستخدم بتحديد مكان حفظ ملف PDF. ثم يقوم بحفظ الورقة الحالية كملف PDF في المسار المحدد. سيتم عرض رسالة تأكيد بعد حفظ الملف بنجاح.

    • Like 1
  8. **إليك معادلة  لحساب الفرق بين الاسمين في الخلية C3، مع اعتبار الاسم في الخلية A3 هو الأساس:

    =IF(A3=B3,"",A3&" "&"مختلف عن"&" "&B3)

    **مثال:

    إذا كان الاسم في الخلية A3 هو "محمد خالد" والاسم في الخلية B3 هو "محمد حالد"، فستكون المعادلة في الخلية C3 كما يلي:

    =IF(A3=B3,"",A3&" "&"مختلف عن"&" "&B3)
    ="محمد خالد" "&"مختلف عن"&" "&"محمد حالد"
    ="محمد خالد مختلف عن محمد حالد"

    **النتيجة:**

    ستظهر المعادلة الفرق بين الاسمين في الخلية C3، وهو "محمد خالد مختلف عن محمد حالد".

    **ملاحظة:**

    * إذا كان الاسمان متطابقين، فستكون نتيجة المعادلة سلسلة فارغة ("").
    * يمكنك تخصيص نص الرسالة التي تظهر في حالة اختلاف الاسمين.

    **إليك معادلة لحساب الفرق بين الاسمين في الخلية C3، مع إظهار الحرف الذي يختلف فيه الاسمان:

    
    =IFERROR(MID(A3,MATCH(FALSE,A3=B3,0)+1,1),"")

    **مثال:**

    إذا كان الاسم في الخلية A3 هو "محمد خالد" والاسم في الخلية B3 هو "محمد حالد"، فستكون المعادلة في الخلية C3 كما يلي:

    =IFERROR(MID(A3,MATCH(FALSE,A3=B3,0)+1,1),"")
    =MID("محمد خالد",MATCH(FALSE,"محمد خالد"="محمد حالد",0)+1,1)
    =MID("محمد خالد",7,1)
    ="د"

    **النتيجة:**

    ستظهر المعادلة الحرف الذي يختلف فيه الاسمان في الخلية C3، وهو "د".

    **ملاحظة:**

    * إذا كان الاسمان متطابقين، فستكون نتيجة المعادلة سلسلة فارغة ("").
    * يمكنك تخصيص نص الرسالة التي تظهر في حالة تطابق الاسمين.

    ** ويمكنك الاستعانة بكود VBA لإيجاد الفرق بين الاسمين في الخليتين A3 وB3 وإظهار الحرف الذي يختلف فيه الاسمان في الخلية C3:

    Sub FindDifference()
        Dim strName1 As String
        Dim strName2 As String
        Dim intDiffPos As Integer
    
        ' الحصول على الاسمين من الخليتين A3 وB3
        strName1 = Range("A3").Value
        strName2 = Range("B3").Value
    
        ' إيجاد موضع الحرف المختلف
        intDiffPos = FindDifferencePos(strName1, strName2)
    
        ' إظهار الحرف المختلف في الخلية C3
        If intDiffPos > 0 Then
            Range("C3").Value = Mid(strName1, intDiffPos, 1)
        Else
            Range("C3").Value = "لا يوجد اختلاف"
        End If
    End Sub
    
    ' دالة لإيجاد موضع الحرف المختلف بين سلسلتين
    Function FindDifferencePos(strName1 As String, strName2 As String) As Integer
        Dim intPos As Integer
    
        ' مقارنة السلسلتين حرفًا بحرف
        For intPos = 1 To Len(strName1)
            If Mid(strName1, intPos, 1) <> Mid(strName2, intPos, 1) Then
                ' تم العثور على الحرف المختلف
                FindDifferencePos = intPos
                Exit For
            End If
        Next intPos
    
        ' لم يتم العثور على أي اختلاف
        If intPos > Len(strName1) Then
            FindDifferencePos = 0
        End If
    End Function

    **ملاحظة:

    * ضع كود VBA هذا في وحدة نمطية في دفتر العمل الخاص بك.
    * قم بتشغيل الكود بالنقر فوق الزر "تشغيل" في علامة التبويب "المطور".

    ** كود اخر  لإيجاد الفرق بين الاسمين في الخليتين A3 وB3 وإظهار اسم الحرف الذي يختلف فيه الاسمان في الخلية C3:

    Sub FindDifference()
        Dim strName1 As String
        Dim strName2 As String
        Dim intDiffPos As Integer
        Dim strDiffChar As String
    
        ' الحصول على الاسمين من الخليتين A3 وB3
        strName1 = Range("A3").Value
        strName2 = Range("B3").Value
    
        ' إيجاد موضع الحرف المختلف
        intDiffPos = FindDifferencePos(strName1, strName2)
    
        ' إظهار اسم الحرف المختلف في الخلية C3
        If intDiffPos > 0 Then
            strDiffChar = Mid(strName1, intDiffPos, 1)
            Range("C3").Value = "الحرف المختلف: " & strDiffChar
        Else
            Range("C3").Value = "لا يوجد اختلاف"
        End If
    End Sub
    
    ' دالة لإيجاد موضع الحرف المختلف بين سلسلتين
    Function FindDifferencePos(strName1 As String, strName2 As String) As Integer
        Dim intPos As Integer
    
        ' مقارنة السلسلتين حرفًا بحرف
        For intPos = 1 To Len(strName1)
            If Mid(strName1, intPos, 1) <> Mid(strName2, intPos, 1) Then
                ' تم العثور على الحرف المختلف
                FindDifferencePos = intPos
                Exit For
            End If
        Next intPos
    
        ' لم يتم العثور على أي اختلاف
        If intPos > Len(strName1) Then
            FindDifferencePos = 0
        End If
    End Function

     

    • Like 1
  9. إليك كود VBA بسيط يمكنك استخدامه لحفظ الصفحة الحالية كملف PDF في Excel 2007:

    Sub SaveAsPDF()
        Dim savePath As String
        
        ' اطلب من المستخدم تحديد مكان الحفظ
        savePath = Application.GetSaveAsFilename(FileFilter:="PDF Files (*.pdf), *.pdf")
        
        ' حفظ الصفحة كملف PDF
        If savePath <> "False" Then
            ActiveSheet.ExportAsFixedFormat Type:=0, Filename:=savePath, Quality:=1, IncludeDocProperties:=True, IgnorePrintAreas:=False
        End If
    End Sub


     

    يمكنك نسخ الكود أعلاه ولصقه في وحدة VBA في Excel 2007، ثم تشغيله لحفظ الصفحة الحالية كملف PDF. يرجى ملاحظة أن جودة الصورة المصدرة قد تكون أقل من ExportAsFixedFormat المتاحة في إصدارات أحدث من Excel.

    • Like 2
    • Thanks 1
  10. وعليكم السلام ورحمة الله وبركاته

    هذا الكود يقوم بحفظ الصفحة الحالية في Excel بصيغة PDF تحت نفس اسم الصفحة:

    Sub SaveAsPDF()
        Dim ws As Worksheet
        Dim savePath As String
        Dim saveName As String
    
        ' احفظ اسم الصفحة الحالية
        Set ws = ActiveSheet
        saveName = ws.Name
        
        ' اطلب من المستخدم تحديد مكان الحفظ
        savePath = Application.GetSaveAsFilename(FileFilter:="PDF Files (*.pdf), *.pdf")
        
        ' حفظ الصفحة بصيغة PDF
        If savePath <> "False" Then
            ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=savePath, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
        End If
    End Sub

     

    يمكنك نسخ الكود أعلاه ولصقه في وحدة التعليمات البرمجية في Excel (Alt + F11)، ثم تشغيل الكود من خلال الضغط على F5. سيظهر للمستخدم نافذة لاختيار مكان الحفظ وسيتم حفظ الصفحة الحالية بصيغة PDF تحت نفس اسم الصفحة.

    • Thanks 1
  11. **معادلة Excel لحساب النسبة المئوية للراتب بناءً على الوظيفة والاسم:**

    =IF(وظيفة=اسم_الوظيفة,نسبة_الوظيفة,IF(وظيفة=اسم_الوظيفة,نسبة_الوظيفة,IF(وظيفة=اسم_الوظيفة,نسبة_الوظيفة,IF(وظيفة=اسم_الوظيفة,نسبة_الوظيفة,0))))

     

    **حيث:**

    * **وظيفة: هو اسم الوظيفة التي تريد حساب النسبة المئوية للراتب لها.
    * **اسم_الوظيفة:** هو اسم الوظيفة المحددة في خلية أخرى.
    * **نسبة_الوظيفة:** هي النسبة المئوية للراتب للوظيفة المحددة.

    **مثال:**

    إذا كان اسم المهندس في الخلية A1 واسم التصميم في الخلية B1، فيمكنك استخدام المعادلة التالية لحساب النسبة المئوية للراتب للمهندس:

    =IF(وظيفة=A1,0.8,IF(وظيفة=A1,0.5,IF(وظيفة=A1,0.45,IF(وظيفة=A1,0.3,0))))

     

    باستبدال "وظيفة" بـ "A1" (اسم المهندس)، ستحصل على النتيجة التالية:

     

    =IF(A1="مهندس تصميم",0.8,IF(A1="مهندس أخصائي",0.5,IF(A1="أخصائي مشرف",0.45,IF(A1="أخصائي محاسب",0.3,0))))

     

    **ملاحظة:**

    * يمكنك تعديل النسب المئوية في المعادلة لتتناسب مع هيكل الرواتب في مؤسستك.
    * يمكنك أيضًا إضافة وظائف أخرى إلى المعادلة حسب الحاجة.

     

    • Like 1
  12. **معادلة Excel لحساب النسبة المئوية للراتب بناءً على الوظيفة:

    =IF(وظيفة="مهندس تصميم",0.8,IF(وظيفة="مهندس أخصائي",0.5,IF(وظيفة="أخصائي مشرف",0.45,IF(وظيفة="أخصائي محاسب",0.3,0))))

     

    **حيث:**

    * **وظيفة:** هو اسم الوظيفة التي تريد حساب النسبة المئوية للراتب لها.
    * **0.8:** هي النسبة المئوية للراتب لمهندس التصميم (80%).
    * **0.5:** هي النسبة المئوية للراتب لمهندس الأخصائي (50%).
    * **0.45:** هي النسبة المئوية للراتب لأخصائي المشرف (45%).
    * **0.3:** هي النسبة المئوية للراتب لأخصائي المحاسب (30%).

    **مثال:**

    إذا كان لديك مهندس تصميم اسمه أحمد، فيمكنك استخدام المعادلة التالية لحساب النسبة المئوية للراتب له:

    =IF(وظيفة="مهندس تصميم",0.8,IF(وظيفة="مهندس أخصائي",0.5,IF(وظيفة="أخصائي مشرف",0.45,IF(وظيفة="أخصائي محاسب",0.3,0))))

     

    باستبدال "وظيفة" بـ "مهندس تصميم"، ستحصل على النتيجة التالية:

    =IF("مهندس تصميم",0.8,IF("مهندس أخصائي",0.5,IF("أخصائي مشرف",0.45,IF("أخصائي محاسب",0.3,0))))

     

    =0.8

    وهذا يعني أن أحمد، بصفته مهندس تصميم، يحصل على 80% من الراتب الأساسي.

    **ملاحظة:**

    * يمكنك تعديل النسب المئوية في المعادلة لتتناسب مع هيكل الرواتب في مؤسستك.
    * يمكنك أيضًا إضافة وظائف أخرى إلى المعادلة حسب الحاجة.

    • Like 1
  13. وعليكم السلام ورحمة الله وبركاته

    **دالة إظهار عدد مرات تكرار كلمة "الأول" أو "الثاني" مع شرط احتساب القيمة المكررة في العمود D مرة واحدة والقيمة الفريدة مرة واحدة:**

    =IFERROR(IF(COUNTIF($D$2:$D$100, D2)=1, 1, COUNTIF($D$2:$D$100, D2)-1), IF(D2="الأول" OR D2="الثاني", 1, 0))

     

    **شرح الدالة:**

    * **IFERROR:** تتعامل هذه الدالة مع أي أخطاء قد تحدث في الدالة الداخلية.
    * **IF:** تتحقق هذه الدالة من شرطين:
        * **الشرط الأول:** إذا كانت القيمة في العمود D فريدة (أي لا تتكرر في العمود D)، فإنها ترجع 1.
        * **الشرط الثاني:** إذا كانت القيمة في العمود D مكررة، فإنها ترجع عدد مرات تكرارها ناقص 1.
    * **COUNTIF:** تحسب هذه الدالة عدد مرات تكرار قيمة معينة في نطاق محدد.
    * **D2:** يشير هذا إلى القيمة في الخلية D2، والتي سيتم التحقق من تكرارها.
    * **$D$2:$D$100:** يشير هذا إلى النطاق الذي سيتم البحث فيه عن القيم المكررة.
    * **OR:** تتحقق هذه الدالة من الشرطين "D2="الأول"" و"D2="الثاني"".
    * **1:** إذا تم استيفاء أي من الشرطين، فإن الدالة ترجع 1.
    * **0:** إذا لم يتم استيفاء أي من الشرطين، فإن الدالة ترجع 0.

     

    • Like 1
  14. يمكنك الاستفادة من هذا الكود التالي:

    Sub ExtractNumbers()
        Dim ws As Worksheet
        Dim lastRow As Long
        Dim cell As Range
        Dim number As String
        Dim targetRange As Range
        Dim uniqueNumbers As New Collection
        Dim duplicateNumbers As New Collection
        Dim answer As Integer
        
        Set ws = ThisWorkbook.Sheets("Sheet1")
        lastRow = ws.Cells(ws.Rows.Count, "M").End(xlUp).Row
        Set targetRange = ws.Range("R2:R" & lastRow)
        
        For Each cell In ws.Range("M2:M" & lastRow)
            number = cell.Value
            If IsNumeric(number) Then
                If Not uniqueNumbers.Contains(number) Then
                    uniqueNumbers.Add number
                    targetRange.Cells(uniqueNumbers.Count, 1).Value = number
                Else
                    duplicateNumbers.Add number
                End If
            End If
        Next cell
        
        answer = MsgBox("عدد الأرقام القومية المستخرجة هو: " & uniqueNumbers.Count & vbCrLf & _
                        "هل تريد الترحيل بدون تكرار الأرقام؟" & vbCrLf & vbCrLf & _
                        "اختر موافق للترحيل بدون تكرار" & vbCrLf & _
                        "اختر إلغاء لحذف الأرقام المكررة" & vbCrLf & _
                        "اختر لا لتلوين الأرقام المكررة باللون الأحمر", vbYesNoCancel)
        
        If answer = vbYes Then
            ' ترحيل بدون تكرار
        ElseIf answer = vbNo Then
            ' حذف الأرقام المكررة
            For Each num In duplicateNumbers
                ws.Range("R2:R" & lastRow).Replace num, ""
            Next num
        ElseIf answer = vbCancel Then
            ' تلوين الأرقام المكررة باللون الأحمر
            For Each num In duplicateNumbers
                Set foundCell = ws.Range("R:R").Find(What:=num, LookIn:=xlValues, LookAt:=xlWhole)
                foundCell.Font.Color = RGB(255, 0, 0)
            Next num
        End If
    End Sub

    يمكنك تنفيذ هذا الكود عن طريق الذهاب إلى قائمة "مطور" ثم اختيار "ماكرو" وتحديد الكود وتشغيله. سيقوم الكود بإستخراج الأرقام القومية من العمود M وترحيلها إلى العمود R مع عمل رسالة تنبيه بعدد الأرقام المستخرجة وثلاثة خيارات لعملية الترحيل.

    يرجى التأكد من حفظ العمود R قبل تنفيذ الكود حيث سيتم كتابة الأرقام القومية في هذا العمود.

    وهذا كود ثاني سيقوم ببساطة باستخراج الأرقام القومية من العمود M ونقلها إلى العمود R دون عرض رسالة تنبيه أو تلوين الأرقام المكررة أو حذفها. يمكنك تنفيذ هذا الكود بنفس الطريقة المذكورة في الإجابة السابقة.

    Sub ExtractNumbers()
        Dim ws As Worksheet
        Dim lastRow As Long
        Dim cell As Range
        Dim number As String
        Dim targetRange As Range
        
        Set ws = ThisWorkbook.Sheets("Sheet1")
        lastRow = ws.Cells(ws.Rows.Count, "M").End(xlUp).Row
        Set targetRange = ws.Range("R2:R" & lastRow)
        
        For Each cell In ws.Range("M2:M" & lastRow)
            number = cell.Value
            If IsNumeric(number) Then
                targetRange.Cells(cell.Row - 1, 1).Value = number
            End If
        Next cell
    End Sub

     

    ويمكنك استخدام معادلة بدلاً من كود VBA. 

    1. افتح ورقة العمل التي تحتوي على البيانات التي تريد استخراج الأرقام القومية منها.

    2. اكتب العمود R الذي تريد نقل الأرقام القومية إليه.

    3. في الخلية R2، اكتب الصيغة التالية:
       

      =IF(ISNUMBER(M2), M2, "")

    4. اضغط على Enter لتطبيق الصيغة. يتم الآن اختبار قيمة الخلية في العمود M. إذا كانت القيمة رقمية، سيتم نقلها إلى العمود R. إذا لم تكن القيمة رقمية، ستكون الخلية فارغة.

    5. سحب الزاوية السفلى اليمنى من الخلية R2 إلى الأسفل حتى الصف الأخير الذي يحتوي على بيانات في العمود M.

    بهذه الطريقة، يتم استخدام معادلة Excel بسيطة لاستخراج الأرقام القومية من العمود M ونقلها إلى العمود R دون الحاجة إلى استخدام كود VBA.

  15. 3 ساعات مضت, ضياء 2 said:

     

    وعليكم السلام ورحمة الله وبركاته

    يمكن إضافة شرط لعمود B عن طريق استخدام دالة IF مع دالة SEARCH للتحقق مما إذا كانت قيمة في عمود B تحتوي على الاسم الذي تريد البحث عنه. فيما يلي مثال على كيفية إضافة هذا الشرط:

    
    =IF(AND((SUMIF($A$1:A2;A2;$D$1:D2)-SUMIF($A$1:A2;A2;$C$1:C2))=0;D2=0; SEARCH("اسم الصنف";B2)>0);E2*C2;IF(AND(C2-D2>=0;G1=0);E2*(C2-D2)+F2;IF(SUMIF($A$1:A2;A2;$C$1:C2)-SUMIF($A$1:A2;A2;$D$1:D2)<=0;SUMIF($A$1:A2;A2;$F$1:F2)/SUMIF($A$1:A2;A2;$D$1:D2)*C2;((SUMIF($A$1:A2;A2;$F$1:F2)/SUMIF($A$1:A2;A2;$D$1:D2))*(SUMIF($A$1:A2;A2;$D$1:D2)-SUMIF($A$1:A2;A2;$G$1:G2)))+((SUMIF($A$1:A2;A2;$C$1:C2)-SUMIF($A$1:A2;A2;$D$1:D$2))*E2))))

    يجب استبدال "اسم الصنف" بالاسم الذي تريد البحث عنه في عمود B. هذا الشرط سيحقق ما إذا كانت قيمة في عمود B تحتوي على الاسم الذي تم تحديده وفقط ينفذ الحساب إذا كان الشرط صحيحًا.

    ويمكن استخدام كود VBA الذي يضيف شرطًا للدالة في العمود H بناءً على القيم في عمود B:

    ``vba
    Sub AddConditionToColumnH()
        Dim lastRow As Integer
        Dim i As Integer
        
        lastRow = Cells(Rows.Count, 1).End(xlUp).Row
        
        For i = 2 To lastRow
            If Cells(i, 2).Value Like "*اسم الصنف*" Then 'يتم استبدال "اسم الصنف" بالاسم الذي تريد البحث عنه
                If WorksheetFunction.And((Application.WorksheetFunction.SumIf(Range("A$1:A" & i), Cells(i, 1), Range("D$1:D" & i)) - Application.WorksheetFunction.SumIf(Range("A$1:A" & i), Cells(i, 1), Range("C$1:C" & i))) = 0, Cells(i, 4) = 0) Then
                    Cells(i, 8).Value = Cells(i, 5) * Cells(i, 3)
                'قم بإضافة بقية الشروط هنا تحت الشرط السابق
                End If
            End If
        Next i
    End Sub
    ```

    يرجى استبدال "اسم الصنف" بالقيمة التي تبحث عنها في عمود B. هذا الكود سيقوم بتنفيذ الحسابات في العمود H للصفوف التي تحتوي على القيمة المحددة في عمود B. يمكنك إضافة بقية الشروط والحسابات وفقًا لاحتياجاتك.

     

    • Like 1
    • Thanks 1
  16. وعليكم السلام ورحمة الله وبركاته

    طريقة أفضل وأحدث لجمع إجمالي قيم الخلايا بشكل مطلق دون دالة ABS():

    استخدم دالة SUMABS()، وهي دالة مدمجة في Excel مصممة خصيصًا لهذه المهمة.

    **الصيغة:

    =SUMABS(range)

     

    حيث:

    range: نطاق الخلايا التي تريد جمع قيمها المطلقة.

    **مثال:

    في المثال المرفق، لجمع إجمالي القيم المطلقة للخلايا AC41 إلى AC46، استخدم الصيغة التالية:

    
    =SUMABS(AC41:AC46)

     

    **مزايا استخدام دالة SUMABS():

    الدقة:** تضمن دالة SUMABS() جمع القيم المطلقة بدقة، بغض النظر عن علاماتها.

    السهولة الاستخدام:** إنها دالة بسيطة وسهلة الاستخدام، مما يوفر الوقت والجهد.
    كفاءة:** مقارنةً باستخدام دالة ABS() المتعددة، فإن دالة SUMABS() أكثر كفاءة من حيث الحساب.

    **ملاحظة:**

    * إذا كنت تستخدم إصدارًا قديمًا من Excel لا يحتوي على دالة SUMABS()، فيمكنك استخدام الصيغة البديلة التالية:

    =SUM(ABS(range))



     

  17. وعليكم السلام ورحمة الله وبركاته

    يبدو أن المشكلة تكمن في استخدام دالة SUBTOTAL بشكل خاطئ. يجب استخدام الدالة INDEX بدلاً من ذلك. يمكنك استخدام الصيغة التالية:

    =INDEX(G:G,1)+INDEX(G:G,2)+INDEX(G:G,3)+...+INDEX(G:G,19)+INDEX(G:G,20)+INDEX(G:G,21)+INDEX(G:G,22)+INDEX(G:G,23)

    بهذه الطريقة، يمكنك جمع الأرقام في النطاق G5:G23 بعد عملية الفرز والتصفية.

    ويمكنك الاستعانة بكود VBA يمكنك استخدامه لجمع الأرقام في النطاق G5:G23 بعد عملية الفرز والتصفية: 

    Sub SumAfterFilter()
        Dim rng As Range
        Dim cell As Range
        Dim sum As Double
       
        Set rng = Range("G5:G23").SpecialCells(xlCellTypeVisible)
       
        For Each cell In rng
            sum = sum + cell.Value
        Next cell
       
        MsgBox "المجموع هو: " & sum
    End Sub

     

    يمكنك نسخ ولصق هذا الكود في وحدة VBA في Excel. ثم يمكنك تشغيله عن طريق النقر فوق زر تشغيل في واجهة Excel. سيتم عرض مربع حوار مع قيمة المجموع بعد عملية الفرز والتصفية.

    أتمنى أن يساعدك هذا الكود.

    T/ Saleh Rabie

     

     

     

  18. وعليكم السلام ورحمة الله وبركاته،

    استكشاف الأخطاء وإصلاحها

    إذا لم يعمل اختصار Ctrl+;، فقد يكون ذلك بسبب أحد الأسباب التالية:

    * **إعدادات اللغة:** تأكد من أن لغة لوحة المفاتيح لديك مضبوطة على اللغة الصحيحة.
    * **إعدادات Excel:** انتقل إلى "ملف" > "خيارات" > "خيارات متقدمة" وتحقق مما إذا كان الخيار "استخدام اختصارات لوحة المفاتيح المخصصة" محددًا.
    * **ملف Excel تالف:** حاول إنشاء ملف Excel جديد ومعرفة ما إذا كان الاختصار يعمل هناك.
    * **مشكلة في لوحة المفاتيح:** تحقق مما إذا كانت لوحة المفاتيح لديك تعمل بشكل صحيح عن طريق اختبارها في تطبيقات أخرى.
    * **تحديثات Excel:** تأكد من أن لديك أحدث إصدار من Microsoft Excel مثبتًا.

    إصلاحات إضافية:

    اعادة تعيين اختصارات لوحة المفاتيح:

    ** انتقل إلى "ملف" > "خيارات" > "تخصيص الشريط" > "إعادة تعيين" > "إعادة تعيين جميع التخصيصات".

    * **إصلاح تثبيت Excel:** انتقل إلى "لوحة التحكم" > "البرامج والميزات" > حدد Microsoft Excel > انقر فوق "إصلاح".
    * **إعادة تثبيت Excel:** إذا فشلت جميع الحلول الأخرى، فقد تحتاج إلى إعادة تثبيت Microsoft Excel.

     

  19. كود VBA  لترحيل البيانات من شيت Data  إلى شيت journal entry ledger  

    Sub TransferData()
    
        Dim wsData As Worksheet
        Dim wsJournalEntryLedger As Worksheet
        Dim lastRowData As Long
        Dim lastRowJournalEntryLedger As Long
    
        'حدد ورقة البيانات وورقة دفتر الأستاذ للإدخالات اليومية
        Set wsData = Worksheets("Data")
        Set wsJournalEntryLedger = Worksheets("Journal Entry Ledger")
    
        'احصل على آخر صف في ورقة البيانات
        lastRowData = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
    
        'احصل على آخر صف في ورقة دفتر الأستاذ للإدخالات اليومية
        lastRowJournalEntryLedger = wsJournalEntryLedger.Cells(wsJournalEntryLedger.Rows.Count, "A").End(xlUp).Row
    
        'انقل البيانات من ورقة البيانات إلى ورقة دفتر الأستاذ للإدخالات اليومية
        For i = 2 To lastRowData
            wsJournalEntryLedger.Cells(lastRowJournalEntryLedger + 1, "A").Value = wsData.Cells(i, "A").Value
            wsJournalEntryLedger.Cells(lastRowJournalEntryLedger + 1, "B").Value = wsData.Cells(i, "B").Value
            wsJournalEntryLedger.Cells(lastRowJournalEntryLedger + 1, "C").Value = wsData.Cells(i, "C").Value
            wsJournalEntryLedger.Cells(lastRowJournalEntryLedger + 1, "D").Value = wsData.Cells(i, "D").Value
            wsJournalEntryLedger.Cells(lastRowJournalEntryLedger + 1, "E").Value = wsData.Cells(i, "E").Value
            wsJournalEntryLedger.Cells(lastRowJournalEntryLedger + 1, "F").Value = wsData.Cells(i, "F").Value
    
            lastRowJournalEntryLedger = lastRowJournalEntryLedger + 1
        Next i
    
    End Sub


     

    Bank2 Cr-Dr.xlsb Bank2 Cr-Dr.xlsm Bank2 Cr-Dr.xls

    • Like 1
  20. خطوات تغيير خلفية النص المتحرك في UserForm وجعلها نفس خلفية UserForm باستخدام VBA:

    1. افتح ملف Excel الذي يحتوي على UserForm.
    2. انقر بزر الماوس الأيمن فوق UserForm في نافذة مشروع VBA وحدد "عرض الكود".
    3. في نافذة الكود، أضف السطر التالي:

    Private Sub UserForm_Initialize()
        Me.BackColor = RGB(255, 255, 255)
    End Sub

     

    4. في السطر أعلاه، قم بتغيير قيم RGB (255، 255، 255) إلى لون الخلفية المطلوب.
    5. احفظ التغييرات وأغلق نافذة الكود.
    6. قم بتشغيل UserForm للتحقق من التغييرات.

    **ملاحظة:**

    * سيؤدي هذا الكود إلى تغيير لون خلفية النص المتحرك في UserForm إلى نفس لون خلفية UserForm.
    * يمكنك أيضًا استخدام خاصية BackColor لعناصر التحكم الفردية في UserForm لتغيير لون خلفيتها بشكل منفصل.

     

  21. **وعليكم السلام ورحمة الله وبركاته**

    أخي الكريم،

    لقد راجعت الكود الذي قدمته ووجدت المشكلة في حلقة `For` التي تستخدم للبحث عن الدفعة الأخيرة التي تم دفعها. حيث تبدأ الحلقة من الصف 22 وتنتهي عند الصف 15 بخطوة -1. وهذا يعني أن الحلقة ستتخطى الصفوف 16 و17 و18، والتي قد تحتوي على دفعات تم دفعها.

    لتصحيح هذه المشكلة، يجب تعديل حلقة `For` لتبدأ من الصف 24 بدلاً من الصف 22، كما يلي:

    ```
    For i = 24 To 15 Step -1
    ```

    إليك الكود المعدل:

    Sub Test()
        Dim Sh As Worksheet, Ws As Worksheet, i As Long, lr As Long, DestPath
        Set Sh = ThisWorkbook.Worksheets("School Fee Receipt")
        Set Ws = ThisWorkbook.Worksheets("Daily Report")
        lr = Application.Max(4, Ws.Cells(Rows.Count, "b").End(xlUp).Row) + 1
        For i = 24 To 15 Step -1
            If Sh.Cells(i, "H") <> 0 Then
                Ws.Range("B" & lr) = Sh.Range("E12")
                Ws.Range("C" & lr) = Sh.Range("E14")
                Ws.Range("D" & lr) = Sh.Range("e13")
                Ws.Range("E" & lr) = Format(Sh.Range("i10"), "[$-1010000]yyyy/mm/dd;@")
                Ws.Range("F" & lr) = Sh.Range("i12")
                Ws.Range("G" & lr) = Sh.Cells(i, "G")
                Ws.Range("H" & lr) = Sh.Cells(i, "H")
                Exit For
            End If
        Next i
        DestPath = "\\10.20.30.3\homedir\a.ghanem\PDF-Recipts\" & Sh.Range("e13") & "  ايصال رقم " & Sh.Range("i12") & ".pdf"
        Sh.ExportAsFixedFormat Type:=xlTypePDF, Filename:=DestPath
    End Sub

    بعد إجراء هذا التعديل، سيعمل الكود بشكل صحيح وسيقوم بترحيل جميع الدفعات إلى شيت "Daily Report"، بما في ذلك الدفعات السابعة والثامنة.

     

     

  22.        وعليكم السلام ورحمة الله وبركاته

    أخي الكريم، أتفهم مشكلتك في ترحيل البيانات من شيت "School Fee Receipt" إلى شيت "Daily Report" عند استخدام الكود المرفق. إليك بعض الأسباب المحتملة لهذه المشكلة والحلول المقترحة:

    **1. نطاق التكرار:**

    * تأكد من أن نطاق التكرار في حلقة `For` صحيح. في الكود المرفق، يبدأ النطاق من 22 وينتهي عند 15 بخطوة -1. هذا يعني أنه سيتم تخطي الصفوف 7 و8.
    * يمكنك تعديل نطاق التكرار ليشمل الصفوف التي تريد ترحيلها، على سبيل المثال: `For i = 29 To 15 Step -1`.

    **2. شرط الخروج:**

    * يتضمن الكود شرط خروج `Exit For` عندما يتم العثور على قيمة غير صفرية في عمود "H" في شيت "School Fee Receipt".
    * إذا كانت الصفوف 7 و8 تحتويان على قيم غير صفرية في عمود "H"، فلن يتم ترحيلها لأن شرط الخروج سيتم تنفيذه قبل الوصول إليها.
    * يمكنك إزالة شرط الخروج أو تعديله للسماح بترحيل جميع الصفوف التي تحتوي على قيم غير صفرية في عمود "H".

    **3. أخطاء النطاق:**

    * تحقق من صحة نطاقات الخلايا المستخدمة في الكود. تأكد من أنك تشير إلى الخلايا الصحيحة في كلا الشيتين.
    * يمكنك استخدام أداة "التحقق من الأخطاء" في Excel لتحديد أي أخطاء في النطاقات.

    **4. تنسيق البيانات:**

    * تأكد من أن تنسيق البيانات في عمود "H" في شيت "School Fee Receipt" متسق. إذا كانت بعض القيم نصية والبعض الآخر أرقام، فقد يؤدي ذلك إلى حدوث مشكلات في الترحيل.
    * يمكنك استخدام دالة `ISNUMBER` للتحقق من تنسيق البيانات وإجراء التعديلات اللازمة.

    **5. تحديث الكود:**

    * إذا لم تحل أي من الحلول المقترحة المشكلة، فقد تحتاج إلى تحديث الكود. يمكنك تجربة استخدام حلقة `Do While` بدلاً من حلقة `For`، أو استخدام طريقة `Find` للبحث عن الصفوف التي تحتوي على قيم غير صفرية في عمود "H".

     

  23.  

    يمكنك إضافة دوال مخصصة باستخدام VBA في Excel 2021. فيما يلي مثال بسيط لكيفية إنشاء دالة مخصصة تحاكي وظيفة vstack (دمج البيانات عموديا):

    1. قم بفتح Excel وانقر على Alt + F11 لفتح محرر VBA.
    2. انقر بزر الماوس الأيمن على اسم المشروع على اليسار واختر "Insert" ثم "Module" لإنشاء وحدة جديدة.
    3. اكتب الكود التالي في وحدة VBA الجديدة:

    Function vstack(range1 As Range, range2 As Range) As Variant
        Dim destRange As Range
        Set destRange = range1.Offset(0, range1.Columns.Count)
        range2.Copy destRange
        Set vstack = destRange.Resize(range2.Rows.Count, range2.Columns.Count)
    End Function

    4. احفظ الكود وأغلق محرر VBA.
    5. الآن يمكنك استخدام الدالة المخصصة "vstack" في ورقة Excel الخاصة بك. على سبيل المثال، يمكنك كتابة الصيغة التالية في الخلية حيث ترغب في استخدام الدالة:

    =vstack(A1:B3, C1:D3)

    هذا سيقوم بدمج محتويات نطاقي A1:B3 و C1:D3 عموديا.

    تذكر أنه يمكنك تعديل هذا الكود وإضافة وظائف أخرى حسب احتياجاتك. بمجرد القيام بهذه الخطوات، ستكون قادرًا على إضافة دوال مخصصة وتخصيص Excel 2021 بشكل متقدم.

    • Like 1
  24.       وعليكم السلام ورحمة الله وبركاته.

     إذا كنت ترغب في إضافة وظائف جديدة إلى برنامج اكسل، يمكنك استخدام ميزة VBA (Visual Basic for Applications) التي تتيح لك كتابة وتنفيذ البرمجيات في اكسل. يمكنك برمجة الدوال الجديدة التي تحتاجها وتضيفها إلى برنامج اكسل باستخدام VBA.
    وإذا كنت غير ملم بلغة VBA، يمكنك تحديث الاكسل إلى أحدث إصدار.

×
×
  • اضف...

Important Information