使用VBA将EXCEL生成PPT

有这样一个需求,将EXCEL中的每行记录自动生成为1张PPT,如下图有2条记录则生成2张PPT。

开发工具--VB编辑器

Project--WPS表格对象--ThisWorkbook--粘贴代码

运行程序,自动生成PPT

复制代码
Sub ExportToPPTAsKeyValueTable_ByRow_AdjustedSize()
    Dim pptApp As Object
    Dim pptPres As Object
    Dim pptSlide As Object
    Dim xlSheet As Worksheet
    Dim lastCol As Long
    Dim lastRow As Long
    Dim i As Long, j As Long
    Dim tbl As Object ' PowerPoint Table
    
    ' 将厘米转换为磅
    Const CM_TO_POINTS As Double = 28.3465
    Dim tableWidth As Double
    Dim tableHeight As Double
    Dim tableLeft As Double
    Dim tableTop As Double
    
    tableWidth = 33.87 * CM_TO_POINTS
    tableHeight = 19.05 * CM_TO_POINTS
    tableLeft = 0
    tableTop = 0
    
    Set xlSheet = ThisWorkbook.Sheets(1)
    
    ' === 获取有效数据范围 ===
    Const xlToLeft As Long = 1
    Const xlUp As Long = -4162
    
    ' 最后一列(基于第1行)
    If Application.WorksheetFunction.CountA(xlSheet.Rows(1)) = 0 Then
        MsgBox "第1行(标题行)为空!", vbExclamation
        Exit Sub
    End If
    lastCol = xlSheet.Cells(1, xlSheet.Columns.Count).End(xlToLeft).Column
    
    ' 最后一行(基于第1列)
    If Application.WorksheetFunction.CountA(xlSheet.Columns(1)) = 0 Then
        MsgBox "第1列无数据!", vbExclamation
        Exit Sub
    End If
    lastRow = xlSheet.Cells(xlSheet.Rows.Count, 1).End(xlUp).Row
    
    ' 至少要有标题 + 1 行数据
    If lastRow < 2 Then
        MsgBox "没有数据行(至少需要第2行)!", vbExclamation
        Exit Sub
    End If
    
    ' === 启动 PowerPoint ===
    On Error Resume Next
    Set pptApp = GetObject(, "PowerPoint.Application")
    If pptApp Is Nothing Then Set pptApp = CreateObject("PowerPoint.Application")
    On Error GoTo 0
    
    If pptApp Is Nothing Then
        MsgBox "无法启动 PowerPoint!", vbCritical
        Exit Sub
    End If
    
    pptApp.Visible = True
    Set pptPres = pptApp.Presentations.Add
    
    ' === 遍历每一行数据(从第2行到lastRow)===
    Dim slideIndex As Long
    For i = 2 To lastRow
        ' 添加新幻灯片
        Set pptSlide = pptPres.Slides.Add(pptPres.Slides.Count + 1, 12) ' 空白版式
        
        ' 创建表格:lastCol 行 × 2 列(不含标题行)
        Set tbl = pptSlide.Shapes.AddTable(lastCol, 2, tableLeft, tableTop, tableWidth, tableHeight).Table
        
        With tbl
            ' --- 数据行(键值对)---
            For j = 1 To lastCol
                .Cell(j, 1).Shape.TextFrame2.TextRange.Text = CStr(xlSheet.Cells(1, j).Value)
                .Cell(j, 2).Shape.TextFrame2.TextRange.Text = CStr(xlSheet.Cells(i, j).Value)
                
                ' 居中对齐
                .Cell(j, 1).Shape.TextFrame2.TextRange.ParagraphFormat.Alignment = 2
                .Cell(j, 2).Shape.TextFrame2.TextRange.ParagraphFormat.Alignment = 2
                
                ' 交替背景色(可选)
                If j Mod 2 = 1 Then
                    .Cell(j, 1).Shape.Fill.ForeColor.RGB = RGB(91, 155, 213)
                    .Cell(j, 2).Shape.Fill.ForeColor.RGB = RGB(91, 155, 213)
                Else
                    .Cell(j, 1).Shape.Fill.ForeColor.RGB = RGB(250, 250, 250)
                    .Cell(j, 2).Shape.Fill.ForeColor.RGB = RGB(250, 250, 250)
                End If
            Next j
            
            ' 调整表格列宽以适应指定宽度
           ' >>> 关键修改:自定义列宽比例 <<<
            .Columns(1).Width = tableWidth * 0.35  ' 字段列窄一些
            .Columns(2).Width = tableWidth * 0.65  ' 值列宽一些
        End With
    Next i
    
    MsgBox "成功导出 " & (lastRow - 1) & " 张幻灯片!", vbInformation
End Sub
相关推荐
火山引擎开发者社区38 分钟前
技术速递|使用 GitHub Copilot CLI 构建 Emoji 列表生成器
人工智能
codefan※1 小时前
干掉“幻觉“实战:如何构建企业级知识图谱增强 RAG
人工智能·知识图谱
wukangjupingbb1 小时前
传统基于药物 SMILES 序列和蛋白质氨基酸序列的 DTI(Drug-Target Interaction)预测方法的缺陷
人工智能
沪漂阿龙2 小时前
Codex 额度重置周期变化:AI 编程免费试玩时代正在结束
人工智能
TickDB2 小时前
美股行情 API 接入避坑:REST 快照、WebSocket 推送、盘前盘后数据的边界
人工智能·python·websocket·行情数据 api
装不满的克莱因瓶2 小时前
深入理解卷积神经网络(CNN)——从原理到代码实践
人工智能·神经网络·cnn
完成大叔2 小时前
模块二,Agent知识图谱的工具链思考
人工智能
lauo2 小时前
ibbot手机发布:搭载poplang技术 + token节点经济,革新AI手机体验
人工智能·智能手机
咖啡星人k2 小时前
云端开发环境技术架构深度解析:从容器隔离到AI Agent集成
人工智能·架构
袋鼠云数栈2 小时前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能