تولید پرزنتیشن پاورپوینت بصورت خودکار(بخش دوم)

در مطلب پرزنتیشن پاورپوینت بصورت خودکار(بخش یکم) از یک فایل اکسل که داده‌های خام را شامل میشد، اقدام به استخراج داده‌های مورد نیاز کردیم(البته قابل ذکر است این روند فعلا ادامه خواهد داشت زیرا پرزنتیشنی که مورد نیاز است بیش از این‌ها اسلایدهای گوناگون نیاز دارد) سپس با ساخت یک فایل پاورپوینت به‌عنوان یک فایل تمپلیت(Template) نمودارهای اولیه مورد نیازمان را تهیه‌کردیم(نمودارهای ساخته‌شده تنها بخشی از کار می‌باشد و بقیه نمودارها به مرور تهیه‌ و مقاله‌ای درباره آن‌ها ایجاد خواهدشد)، در ادامه به نحوه اتصال به بانک اطلاعاتی‌مان(همان فایل اکسل) و چندتابع مورد نیاز دیگر را شرح می‌دهیم.


 

♦برای این‌که بتوان پرزنتیشن بصورت اتوماتیک و خودکار تهیه‌کرد باید مراحل زیر انجام‌گردد:

  1. اتصال به داده‌های درون اکسل‌ فایل
  2. ایجاد یک حلقه برای خواندن داده‌ها و تهیه اسلایدها
  3. انتتقال داده‌ها براساس فیلترها(مانند کد کالا، مشتری، کشور و ...) به نمودارهای داخل پاورپوینت، برای این منظور نیاز به انجام کارهای زیر است:
    • ایج اد یک اسلاید جدید از روی اسلایدهای تمپلیت(Template) و انتقال آن به انتهای پاورپوینت به عنوان اسلایدی که باید تهیه گردد.
    • فیلتر کردن داده‌های اکسل فایل اصلی 
    • انتخاب تک تک نمودارها و باز کردن Edit Data درون حافظه
    • انتقال اطلاعات از اکسل‌ فایل اصلی به اکسل شیت نمودار فوق
  4. بازگشت به مرحل سوم تا انتهای اطلاعات
  5. پایان کار و بستن اطلاعات اکسل فایل اصلی

♦ مقدمات کار: هر دو فایل اکسل و پاورپوینت را که در این مقاله ساخته‌شده در یک فولدر ذخیره‌کنید، سپس هر دوی آنها را بازکنید، توجه داشته باشید فایل پاورپوینت شما باید قابلیت ماکروی آن Enable شده باشد برای این منظور به در فایل پاورپوینت به قسمت File > Options > Trust Center > Trust Center Settings > Macro Settings بروید و گزینه Enable all macro (not  recommended; potentially dangerous code can run) را در صورت فعال نبودن فعال نمایید( هفتک یا همان تیک بزنید) و Ok نمایید.

در پاورپوینت دکمهALT  را گرفته و F11 را بزنید(در واقع وارد محیط برنامه‌نویسی شوید، می‌توانید از تب Developer گزینه Visual Basic را بزنید).

صفحه بازشده روی گزینه VBAProject راست‌کلیک‌ کرده و از گزینه Insert گزینه Module را انتخاب کنید(مطابق شکل)

از این به بعد برنامه‌نویسی آغاز می‌گردد، لذا برای جلوگیری از خطا باید با دقت بیشتری مراحل را دنبال کنید. در زیر را به ماژول(Module) اضافه‌کنید. سپس از طریق Tools->References ریفرنس excel را به برنامه اضافه کنید. برای من Microsoft Excel 16.0 Object Library می‌باشد، اما ممکن است برای شما(بسته به ورژن آفیس شماست) بجای 16.0 اعدادی مانند 15.0 و یا 14.0 ظاهر شود.(توجه از این به بعد امکان دارد در زمان‌هایی لازم باشد تا به کدها اضافه یا کم شود)

    

♦ تعریف متغیرها: کدهای زیر را به ماژول اضافه کنید:

Public Const excelFileName As String = "Orders.xlsm"
Public excelApp As Object `= Public excelApp As Excel.Application
Public excelWorkbook As Object `=Public excelWorkbook As Workbook

excelApp: اطلاعات فایل اکسل در این متغیر قرارمی‌گیرد(می‌توان از Excel.Application بجای Object استفاده‌کرد).
excelWorkbook: ورکبوک(Workbook) را در این متغیر قرار می‌گیرد(می‌توان از Workbook بجای Object استفاده‌کرد).

♦ روتین باز کردن  و اتصال به فایل اکسل اصلی:

Sub ConnectToExcel()
    Dim isAlreadyOpen As Boolean
    Dim wb As Object
    
    `Get current PowerPoint folder path
    filePath = ActivePresentation.Path & "\" & excelFileName
    
    `Check if file exists
    If Dir(filePath) = "" Then
        MsgBox "Excel file not found", vbExclamation, "Error"
        Exit Sub
    End If
    
    `Try to get running Excel instance
    On Error Resume Next
    Set excelApp = GetObject(, "Excel.Application")
    On Error GoTo 0
    
    `Create new Excel instance if not running
    If excelApp Is Nothing Then
        Set excelApp = CreateObject("Excel.Application")
        isAlreadyOpen = False
    Else
        `Check if our file is already open
        isAlreadyOpen = False
        For Each wb In excelApp.Workbooks
            If StrComp(wb.FullName, filePath, vbTextCompare) = 0 Then
                isAlreadyOpen = True
                Set excelWorkbook = wb
                Exit For
            End If
        Next wb
    End If
    
    `Open file if not already open
    If Not isAlreadyOpen Then
        Set excelWorkbook = excelApp.Workbooks.Open(filePath)
    End If
    
    `Show Excel window (optional)
    excelApp.Visible = True
End Sub
  • خط 8 تا 12 کنترل می‌کند آیا فایل اکسل وجود دارد یا نه.
  • خط‌های 14 تا 17 بررسی می‌کند آیا اینیستنسی(Instance) از اکسل در حافظه باز است یا خیر(از آنجایی که اگر باز نباشد خطا اتفاق میافتد و برنامه متوقف می‌گردد لذا برای جلوگیری از خطا از On Error Resume Next استفاده شده.
  • خط‌های 20 تا 22 یک اینستنس اکسل در حافظه ایجاد می‌کند
  • خط‌های 24 تا 30 چک می‌کند آیا حالا که اینیستنسی از اکسل در حافظه وجود دارد، آیا فایل مورد نظر ما(در اینجا Orders.xlsm) نیز در حافظه هست یا خیر.
  • خط 41 نیز اگر بخواهید می‌توانید بردارید(در صورتی که بخواهید فایل اکسل‌مان در پس‌زمینه باشد در این خط مقدار false قرار دهید).

♦ روتین بستن فایل‌ها و خالی‌کردن حافظه:

Sub Disconnect()
    ` --- For closing Excel later ---
     excelWorkbook.Close SaveChanges:=False
     excelApp.Quit
     Set excelWorkbook = Nothing
     Set excelApp = Nothing
End Sub

دستور excelWorkbook.Close SaveChanges:=False بدون اینکه فایل اصلی اسلی را تغییر دهد آن را می‌بندد(مانند آن است که شما اقدام به بستن فایل کنید و در برابر سوال اینکه تغییرات ذخیره شود گزینهNo را انتخاب کنید)

♦ روتین انتقال داده‌ها از فایل اکسل اصلی: این روتین با توجه به رنجی Range که انتخاب می‌کنیم به محلی که قرار است اطلاعات به آنجا منتقل‌ گردد و روش انتقال اطلاعات(دلخواه می‌باشد و مشخص می‌کند انتقال مستقیم یا 90درجه چرخیده باشد) سعی شده تا جای ممکن این انتقال با بیشترین سرعت ممکن انجام گردد.

Function TransferData(SourceRange As Range, TargetStartCell As Range, Optional Transpose As Boolean = False) As Boolean
    On Error GoTo ErrorHandler
    excelApp.ScreenUpdating = False
    excelApp.Calculation = xlCalculationManual
    excelApp.EnableEvents = False
    
    Dim dataArray() As Variant
    Dim targetSheet As Worksheet
    Dim targetWorkbook As Workbook
    
    dataArray = SourceRange.Value
    
    Set targetSheet = TargetStartCell.Worksheet
    Set targetWorkbook = targetSheet.Parent
    
    If Transpose Then
        targetSheet.Range(TargetStartCell.Address).Resize( _
            UBound(dataArray, 2), UBound(dataArray, 1)).Value = _
            Application.WorksheetFunction.Transpose(dataArray)
    Else
        targetSheet.Range(TargetStartCell.Address).Resize( _
            UBound(dataArray, 1), UBound(dataArray, 2)).Value = dataArray
    End If
    
    TransferData = True

ExitHandler:
    excelApp.ScreenUpdating = True
    excelApp.Calculation = xlCalculationAutomatic
    excelApp.EnableEvents = True
    Exit Function

ErrorHandler:
    TransferData = False
    MsgBox "Error: " & Err.Description, vbCritical
    Resume ExitHandler
End Function
  • خط 2 نوع عملیات پس از بروز خطا را مشخص می‌کند
  • خط 3 تا 5 برای افزایش سرعت است و جلوگیری از کارهای اضافه در زمان انتقال می‌کند.
  • خط 11 بدلیل اینکه ما دستور Transpose یا چرخش داده به میزان 90درجه را داریم بهترین روش استفاده از آرایه می‌باشد، اطلاعات مورد نیاز را از فایل اصلی داخل آرایه می‌ریزیم.
  • خط‌های 16 تا 23 فقط مقدارها را(مانند آن است که داده‌ها به روش PasteValue انتقال یابد) انتقال می‌دهد.

در قسمت بعدی نحوه تهیه اسلایدها براساس داده‌های درون اکسل را خواهید فهمید.


فایلهای مطلب

کپی
لینک اشتراک گذاری

  • 193
  • 0