ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3775|回复: 10

用VBA随机生成word试卷,发现word试卷奇怪现象,字符残缺,不固定,怎么办?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-6 20:55 | 显示全部楼层 |阅读模式
现象描述:用VBA随机生成word试卷(office  2007),发现word试卷出现下图现象,字符残缺,不固定,一些字符会奇怪的移位,如“错误”的“误”会一道下一个“错误”的后面,成为错误误,字符残缺问题在把段落样式修改后,得以解决,但个别字符移位情况不会改善。


解决思路:百度,但无解。


请教各位了!



error.png
.......................................................................................‘以下为随机生成试卷excel表代码
Sub 填空题()
Dim mr As Range
Dim tk As Integer
tk = Sheets("线路新安规(填空)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a2:a6")
    Do
    mr = Int(Rnd() * tk + 1)
    Loop Until Application.CountIf(Range("a2:a6"), mr) = 1
'目标区域Range("a2:a11")中等于mr的个数为1
Next mr
单选题
End Sub


Sub 单选题()
Dim mr As Range
Dim tk As Integer
tk = Sheets("线路新安规(单选)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a7:a22")
    Do
    mr = Int(Rnd() * tk + 1)
    Loop Until Application.CountIf(Range("a7:a22"), mr) = 1
'目标区域Range("a2:a11")中等于mr的个数为1
Next mr
多选题
End Sub

Sub 多选题()
Dim mr As Range
Dim xz As Integer
xz = Sheets("线路新安规(多选)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a23:a32")
    Do
    mr = Int(Rnd() * xz + 1)
    Loop Until Application.CountIf(Range("a23:a32"), mr) = 1
Next mr
判断题
End Sub
Sub 判断题()
Dim mr As Range, pd As Integer
pd = Sheets("线路新安规(判断)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a33:a42")
    Do
    mr = Int(Rnd() * pd + 1)
    Loop Until Application.CountIf(Range("a33:a42"), mr) = 1
Next mr
简答题
End Sub
Sub 简答题()
Dim mr As Range
Dim jd As Integer
jd = Sheets("线路新安规(简答)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a43:a44")
    Do
    mr = Int(Rnd() * jd + 1)
    Loop Until Application.CountIf(Range("a43:a44"), mr) = 1
Next mr
问答题
End Sub
Sub 问答题()
Dim mr As Range
Dim wd As Integer
wd = Sheets("线路新安规(问答)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a45:a46")
    Do
    mr = Int(Rnd() * wd + 1)
    Loop Until Application.CountIf(Range("a45:a46"), mr) = 1
Next mr
案例分析题
End Sub


Sub 案例分析题()
Dim mr As Range
Dim wd As Integer
wd = Sheets("线路新安规(线路案例分析)复习题").[A65536].End(xlUp).Row - 1
For Each mr In Range("a47:a48")
    Do
    mr = Int(Rnd() * wd + 1)
    Loop Until Application.CountIf(Range("a47:a48"), mr) = 1
Next mr
End Sub


....................................................................................................
    Private Sub CommandButton1_Click()'调用word生成试卷。
    Dim rDATA As Range
    Dim wd As Word.Application
    Dim ret As Integer

    ret = MsgBox("程序即将开始自动生成普考试卷!" & vbCrLf & vbCrLf & _
                 "现在就开始吗?", vbYesNo + vbInformation, "生成普考试卷")
    Call 单选题1
    If ret = vbNo Then Exit Sub

    Set rDATA = Range(Range("Start1").Offset(1, 0), Range("Start1").End(xlDown))
    Set wd = CreateObject("word.application")       ' 创建 WORD 实例

    wd.Visible = True                               ' 使 WORD 可见
    AppActivate wd.Name                             ' 激活 WORD 窗口

    With wd
        .Documents.Add
        With .Selection
         .ParagraphFormat.SpaceBeforeAuto = True
                .Font.Size = 18
                .Font.Bold = True
                .Text = [C1]
                .EndKey
                .TypeParagraph
        End With
         With .Selection
         .ParagraphFormat.SpaceBeforeAuto = True
                .Font.Size = 14
                .Font.Bold = False
                .Text = [B1]
                .EndKey
                .TypeParagraph
        End With
         '导入 EXCEL 文本
        For Each rng In rDATA
            With .Selection

                 '插入分类
                If rng.Offset(0, 1) <> rng.Offset(-1, 1) Then
                    .ParagraphFormat.SpaceBeforeAuto = True ' 段前自动行距
                    .Text = LTrim(RTrim(rng.Offset(0, 1)))
                    .Font.Size = 14
                    .Font.Bold = True 'wdToggle                   ' 切换文本为加粗

                     '底纹灰度级 25
                   ' .ParagraphFormat.Shading.BackgroundPatternColor = wdColorGray25
                    .EndKey                                 ' 移到行末
                   .TypeParagraph                          ' 换行
                    .Font.Bold = wdToggle

                     '取消底纹灰度级
                    '.ParagraphFormat.Shading.BackgroundPatternColor = wdColorAutomatic
                End If

                ' 插入问题
                .ParagraphFormat.SpaceBeforeAuto = True
               .Font.Size = 10.5
                .Font.Bold = False ' wdToggle
                .Text = rng.Offset(0, 3) & "." & rng.Offset(0, 2)
               .EndKey
                .TypeParagraph
            End With

        Next

         '设置页脚
        '.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
        '.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
'       .NormalTemplate.AutoTextEntries("第 X 页 共 Y 页").Insert Where:=.Selection.Range
      '  .ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument







    End With




    Set wd = Nothing

    AppActivate Application.Name                             ' 激活 EXCEL 窗口

    MsgBox "作业已完成, 请另行保存 Word 文档, 如果需要的话."


End Sub






TA的精华主题

TA的得分主题

发表于 2014-9-6 21:53 | 显示全部楼层
看起来显示上是因为固定了行距的原因?把行距调成单倍应该就可以改善吧

代码实在是没有心情看下去。。。。只能提点建议喽

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-7 14:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢!但原因不是这个!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-8 10:08 | 显示全部楼层
试了下,把  .ParagraphFormat.SpaceBeforeAuto = True 去掉或者改为.ParagraphFormat.SpaceBeforeAuto = False
字符残缺的问题解决了!向281334055表示感谢!谢谢你的行距的思路!

TA的精华主题

TA的得分主题

发表于 2014-11-11 09:08 | 显示全部楼层
清风之晨 发表于 2014-9-8 10:08
试了下,把  .ParagraphFormat.SpaceBeforeAuto = True 去掉或者改为.ParagraphFormat.SpaceBeforeAuto = F ...

请教,我也遇到同样的问题,按照上面的思路改写后还是有同样的问题。请问是改下面红色部分吗?

' 插入分类
                If rng.Offset(0, 1) <> rng.Offset(-1, 1) Then
                    .ParagraphFormat.SpaceBeforeAuto = True ' 段前自动行距
                    .Text = rng.Offset(0, 1)
                    .Font.Size = 14
                    .Font.Bold = wdToggle                   ' 切换文本为加粗
                    
                    ' 底纹灰度级 25
                    .ParagraphFormat.Shading.BackgroundPatternColor = wdColorGray25
                    .EndKey                                 ' 移到行末
                    .TypeParagraph                          ' 换行
                    .Font.Bold = wdToggle
                    
                    ' 取消底纹灰度级
                    .ParagraphFormat.Shading.BackgroundPatternColor = wdColorAutomatic
                End If

TA的精华主题

TA的得分主题

发表于 2017-1-5 15:16 | 显示全部楼层
楼主怎么不发个完整的文档上来呢,也方便测试 呀

TA的精华主题

TA的得分主题

发表于 2017-1-9 23:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-1-10 14:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-9-17 10:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
   Set rDATA = Range(Range("Start1").Offset(1, 0), Range("Start1").End(xlDown))
start1 哪里来的,谁能解释下

TA的精华主题

TA的得分主题

发表于 2017-9-17 11:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Set rDATA = Range(Range("Start1").Offset(1, 0), Range("Start1").End(xlDown))
谁能告诉我Start1地址是哪里来的啊,百思不得其解,谢谢啊
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 07:27 , Processed in 0.041872 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表