| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 702 人关注过本帖
标题:班主任,我这个下标越界,能帮我看看吗?
只看楼主 加入收藏
hsbwp1314
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:88
专家分:25
注 册:2008-12-1
结帖率:53.85%
收藏
已结贴  问题点数:10 回复次数:9 
班主任,我这个下标越界,能帮我看看吗?
Private Sub Command1_Click()
Dim i, A As Integer
 Dim v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14 As Integer
 
 v1 = 1000
 v2 = v1 + MSFlexGrid1.ColWidth(0) * 1.1      '设备编号
 v3 = v2 + MSFlexGrid1.ColWidth(1) * 1.1      '单位名称
 v4 = v3 + MSFlexGrid1.ColWidth(2) * 0.8      '设备类型
 v5 = v4 + MSFlexGrid1.ColWidth(3) * 0.8      '设备名称
 v6 = v5 + MSFlexGrid1.ColWidth(4) * 0.8      '设备品牌
 v7 = v6 + MSFlexGrid1.ColWidth(5) * 0.8      '设备型号
 v8 = v7 + MSFlexGrid1.ColWidth(6) * 1.2      '设备序列号
 v9 = v8 + MSFlexGrid1.ColWidth(7) * 1        '购入时间
 v10 = v9 + MSFlexGrid1.ColWidth(8) * 1       '使用时间
 v11 = v10 + MSFlexGrid1.ColWidth(9) * 0.7    '使用部门
 v12 = v11 + MSFlexGrid1.ColWidth(10) * 0.8   '设备原值
 v13 = v12 + MSFlexGrid1.ColWidth(11) * 1    '备注
 v14 = 11500
  
 Dim m As Integer         '总记录数
 Dim N As Integer         '每页记录数
 Dim ii As Integer         '总页数
 Dim j As Integer         '页码数
 Dim k As Integer         '每页起始记录控制
Dim TmpLowerPageMoney As Single  '每页合计金额
 m = Int(MSFlexGrid1.Rows - 1) '(TxtWhm_2 入库品种数)----总记录数
 N = 23          '每页 23 条记录
 
 If Int(m / N) - m / N = 0 Then
    ii = m / N
 Else
    ii = Int(m / N) + 1
 End If
 
 Printer.Height = 750 + 300 + 400 * N + 900 + 1000  '定义纸张高度----根据每页记录数
 Printer.Width = 2000                              '定义纸张宽度
 
 For j = 1 To ii             '外循环控制打印页数
   ' TmpLowerPageMoney = 0#   '每页合计金额 ------ 新页开始清零
   
    Printer.CurrentX = 5000
    Printer.CurrentY = 200
    Printer.FontSize = 16
    Printer.Print "长沙市邮政局固定资产清理表(设备)"
   
    Printer.CurrentX = 11000  '页码置于左上角
    Printer.CurrentY = 750
    Printer.FontSize = 10
    Printer.Print "第 " + Trim(Str(j)) + " 页 共 " & Trim(Str(ii)) + " 页"

    Printer.CurrentX = 1000
    Printer.CurrentY = 750
    Printer.FontSize = 10
    Printer.Print "单位名称:" & TxtWhm5.Text
   
      
    '列标题
    'A -------- 表主体纵向高度
    A = 1050
    Printer.Line (v1, A)-(v13, A)             '画顶横线
   
    If MSFlexGrid1.ColWidth(0) > 0 Then     '第1列   设备编号
       Printer.Line (v1, A)-(v1, A + 450)      '画左坚边线
       Printer.CurrentX = v1 + 10
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备编号"
       Printer.Line (v1, A + 450)-(v13, A + 450)
     End If
     If MSFlexGrid1.ColWidth(1) > 0 Then      '第2列 单位名称
       Printer.Line (v2, A)-(v2, A + 450)
       Printer.CurrentX = v2 + 10
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "单位名称"
     End If
     If MSFlexGrid1.ColWidth(2) > 0 Then      '第3列  设备类型
       Printer.Line (v3, A)-(v3, A + 450)
       Printer.CurrentX = v3 + 40
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备类型"
     End If
     If MSFlexGrid1.ColWidth(3) > 0 Then      '第4列  设备名称
       Printer.Line (v4, A)-(v4, A + 450)
       Printer.CurrentX = v4 + 40
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备名称"
     End If
     If MSFlexGrid1.ColWidth(4) > 0 Then       '第5列 设备品牌
       Printer.Line (v5, A)-(v5, A + 450)
       Printer.CurrentX = v5 + 40
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备品牌"
     End If
     If MSFlexGrid1.ColWidth(5) > 0 Then        '第6列 设备型号
       Printer.Line (v6, A)-(v6, A + 450)
       Printer.CurrentX = v6 + 40
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备型号"
     End If
     If MSFlexGrid1.ColWidth(6) > 0 Then       '第7列  设备序列号
       Printer.Line (v7, A)-(v7, A + 450)
       Printer.CurrentX = v7 + 40
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备序列号"
     End If
     If MSFlexGrid1.ColWidth(7) > 0 Then       '第8列  设备购入时间
       Printer.Line (v8, A)-(v8, A + 450)
       Printer.CurrentX = v8 + 20
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备购入时间"
     End If
     If MSFlexGrid1.ColWidth(8) > 0 Then      '第9列  设备使用时间
       Printer.Line (v9, A)-(v9, A + 450)
       Printer.CurrentX = v9 + 20
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备使用时间"
     End If
     If MSFlexGrid1.ColWidth(9) > 0 Then     '第10列  使用部门
       Printer.Line (v10, A)-(v10, A + 450)
       Printer.CurrentX = v10 + 20
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "使用部门"
     End If
     If MSFlexGrid1.ColWidth(10) > 0 Then     '第11列   设备原值(元)
       Printer.Line (v11, A)-(v11, A + 450)
       Printer.CurrentX = v11 + 20
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "设备值(元)"
      ' Printer.Line (v12 + 10, A)-(v12 + 10, A + 450) '画右坚边线(封口)
     End If
     If MSFlexGrid1.ColWidth(11) > 0 Then     '第12列   设备原值(元)
       Printer.Line (v12, A)-(v12, A + 450)
       Printer.CurrentX = v12 + 20
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       Printer.Print "备注"
       Printer.Line (v13 + 10, A)-(v13 + 10, A + 450) '画右坚边线(封口)
     End If
    A = 1500   'A -------- 表主体纵向高度
    Printer.Line (v1, A)-(v14, A) '画横线
   
    If j = 1 Then  'k 每页起始记录控制
       k = 1     'k=0 表示第1行,k=1 表示第2行
    Else
       k = (j - 1) * N + 1
    End If
    For i = k To j * N   'm - (ii - j) * N + 1  '
    '内循环控制每页打印-------------分页打印
     
     If MSFlexGrid1.ColWidth(0) > 0 Then        '第1列      设备编号
       Printer.Line (v1, A)-(v1, A + 400)      '画左坚边线
       Printer.CurrentX = 1000
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 0) <> "" Then   'i=0 时为第1行,标题行   ******提示在这里
         Printer.Print MSFlexGrid1.TextMatrix(i, 0)
      End If
       Printer.Line (v1, A + 400)-(v13, A + 400)
     End If
     If MSFlexGrid1.ColWidth(1) > 0 Then         '第2列     单位名称
       Printer.Line (v2, A)-(v2, A + 400)
       Printer.CurrentX = v2 + 10
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
        If MSFlexGrid1.TextMatrix(i, 1) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 1)
       End If
     End If
     If MSFlexGrid1.ColWidth(2) > 0 Then          '第3列     设备类型
       Printer.Line (v3, A)-(v3, A + 400)
       Printer.CurrentX = v3 + 10
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 2) <> "" Then
          Printer.Print MSFlexGrid1.TextMatrix(i, 2)
        End If
     End If
     If MSFlexGrid1.ColWidth(3) > 0 Then           '第4列     设备名称
       Printer.Line (v4, A)-(v4, A + 400)
       Printer.CurrentX = v4 + 20
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 3) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 3)
       End If
     End If
     If MSFlexGrid1.ColWidth(4) > 0 Then            '第5列    设备品牌
       Printer.Line (v5, A)-(v5, A + 400)
       Printer.CurrentX = v5 + 50
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 4) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 4)
       End If
     End If
     
     If MSFlexGrid1.ColWidth(5) > 0 Then             '第6列   设备型号
       Printer.Line (v6, A)-(v6, A + 400)
       Printer.CurrentX = v6 + 30
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 5) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 5)
       End If
     End If
     If MSFlexGrid1.ColWidth(6) > 0 Then             '第7列    设备序列号
       Printer.Line (v7, A)-(v7, A + 400)
       Printer.CurrentX = v7 + 60
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 6) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 6)
       End If
     End If
     If MSFlexGrid1.ColWidth(7) > 0 Then             '第8列     购入时间
       Printer.Line (v8, A)-(v8, A + 400)
       Printer.CurrentX = v8 + 30
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
     If MSFlexGrid1.TextMatrix(i, 7) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 7)
       End If
     End If
     If MSFlexGrid1.ColWidth(8) > 0 Then             '第9列      使用时间
       Printer.Line (v9, A)-(v9, A + 400)
       Printer.CurrentX = v9 + 60
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 8) <> "" Then
          Printer.Print MSFlexGrid1.TextMatrix(i, 8)
       End If
     End If
     If MSFlexGrid1.ColWidth(9) > 0 Then             '第10列     使用部门
       Printer.Line (v10, A)-(v10, A + 400)
       Printer.CurrentX = v10 + 150
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
     If MSFlexGrid1.TextMatrix(i, 9) <> "" Then
         Printer.Print MSFlexGrid1.TextMatrix(i, 9)
        End If
     End If
     If MSFlexGrid1.ColWidth(10) > 0 Then            '第11列    设备原值
       Printer.Line (v11, A)-(v11, A + 400)
       Printer.CurrentX = v11 + 200
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 10) <> "" Then
          Printer.Print MSFlexGrid1.TextMatrix(i, 10)
       End If
      
      ' Printer.Line (v12, A)-(v12, A + 450)     '画右坚边线(封口)
     End If
     If MSFlexGrid1.ColWidth(11) > 0 Then            '第12列    备注
       Printer.Line (v12, A)-(v12, A + 400)
       Printer.CurrentX = v12 + 100
       Printer.CurrentY = A + 100
       Printer.FontSize = 10
       If MSFlexGrid1.TextMatrix(i, 11) <> "" Then
          Printer.Print MSFlexGrid1.TextMatrix(i, 11)
       End If
      
       Printer.Line (v13, A)-(v13, A + 400)     '画右坚边线(封口)
     End If
     A = A + 400  '行距每次增加 450
    Next i        '内循环结束
    Printer.Line (v1, A)-(v14, A)     '画底边横线

    Printer.NewPage   '新的一页
    Printer.EndDoc    '换页
  
 Next j   '外循环结束
Call MsgBox("正在打印......!", vbOKOnly + vbInformation, "提示...")
End Sub


 

Private Sub Form_Load()
Dim sql As String

sql = "select * from EquInfo order by EID"
createlist (sql)
TxtWhm2.Text = MSFlexGrid1.Rows - 1
End Sub

Public Sub createlist(sql As String)
  Dim rs As New ADODB.Recordset
  Dim i As Integer
  
  With Me.MSFlexGrid1
          .TextMatrix(0, 0) = "设备编号"
          .TextMatrix(0, 1) = "单位名称"
          .TextMatrix(0, 2) = "设备类型"
          .TextMatrix(0, 3) = "设备名称"
          .TextMatrix(0, 4) = "设备品牌"
          .TextMatrix(0, 5) = "设备型号"
          .TextMatrix(0, 6) = "设备序列号"
          .TextMatrix(0, 7) = "设备购入时间"
          .TextMatrix(0, 8) = "使用时间"
          .TextMatrix(0, 9) = "使用部门"
          .TextMatrix(0, 10) = "设备原值(元)"
          .TextMatrix(0, 11) = "备     注"
       For i = 0 To 10
            .ColAlignment(i) = 1     '所有表格对及方式
       Next i
       For i = 0 To 10
            .ColWidth(i) = 1200    '每列宽度
       Next i
            '.ColWidth(3) = 1500
            .ColWidth(11) = 1800
 End With
 Set rs = TransactSQL(sql)
   With Me.MSFlexGrid1
        .Rows = 1
    While Not rs.EOF
       .Rows = .Rows + 1
       .TextMatrix(.Rows - 1, 0) = rs(1)
       .TextMatrix(.Rows - 1, 1) = rs(2)
       .TextMatrix(.Rows - 1, 2) = rs(3)
       .TextMatrix(.Rows - 1, 3) = rs(4)
       .TextMatrix(.Rows - 1, 4) = rs(5)
       .TextMatrix(.Rows - 1, 5) = rs(6)
       .TextMatrix(.Rows - 1, 6) = rs(7)
       .TextMatrix(.Rows - 1, 7) = rs(8)
       .TextMatrix(.Rows - 1, 8) = rs(9)
       .TextMatrix(.Rows - 1, 9) = rs(10)
       .TextMatrix(.Rows - 1, 10) = rs(11)
       .TextMatrix(.Rows - 1, 11) = rs(12)
        rs.MoveNext
    Wend
    End With
      
End Sub


   我想要每页显23条记录,点打印总是下标越界,但是点调试后还是可以打。如果我的数据库只有23条记录,点打印却能正常打。
不能打印.rar (57.43 KB)


[ 本帖最后由 hsbwp1314 于 2010-10-17 09:31 编辑 ]
搜索更多相关主题的帖子: 越界 
2010-10-17 09:29
zmh886
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:238
专家分:1305
注 册:2010-6-2
收藏
得分:0 
For i = k To j * N
改为
For i = k To j * N-1

这个问题好象回过一次了。

http://www./
2010-10-17 17:28
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4940
专家分:30047
注 册:2008-10-15
收藏
得分:0 
一个打印过程,这么多的重复代码啊。

我明天抄一个我的打印代码来。简洁的很。

我的是不规则表格,
每种表格有一个配置文件
配置文件分为三节。
第一节
画线,这节每行4个数字,负责在表上面画线,想通用的的话,可以根据最大坐标然后进行缩放。
第二节
固定显示部分
每行最少为 5 部分,最多为 7 部分。
为 5部分的为矩形坐标,文字必须打印在这个矩形正中,
为 7 部分的,后面二部分是设置 字体及字号的。
第三节,活动部分
这节,第行照样分5部分或7部分。
第5部分,固定部分是固定的字符,这节是数据库里的字段代码或 MSFlexGrid1 里的序号。
判断如下:如果数据是 数字 ,那么就是 序号,直接使用
 MSFlexGrid1.TextMatrix(i, 数据) 来引用。然后显示。

你这种的输出法子。需要多加一节,规定 横线 的 起始位置(不含第一根),每根与上一根的位置差。
这种的话,程序也简单,所有的可以变动的东西都在配置文件中,修改起来也简单。
如你规定最大值宽为 10000 ,那么你按 10000 去布这个表格,然后根据纸张设置,计算出来,纸张只有9700 的话,然后按 9700/10000 来缩放各个坐标罢了。



授人于鱼,不如授人于渔
早已停用QQ了
2010-10-17 20:31
hsbwp1314
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:88
专家分:25
注 册:2008-12-1
收藏
得分:0 
回复 2楼 zmh886
J*N - 1 最后一行打不出来,因为K=1 ,而且一样的是越界,如果数据库里面只有23行,点打印却能正常打。不提示越界
2010-10-18 07:50
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4940
专家分:30047
注 册:2008-10-15
收藏
得分:0 
Public Sub viewdate(pp As Object, lefts As Long, tops As Long)
'画线及显示固定部分
On Error Resume Next

Dim i As Long
Dim fj() As String
Dim vx As Long, vy As Long
Dim Fx As Long, Fy As Long
Dim hx As Long, hy As Long

'--------显示固定文字部分-----------
For i = 0 To UBound(FixedS)
    If Len(FixedS(i)) > 5 Then
        Call viewtext(FixedS(i), pp, lefts, tops)
    End If
Next i

'---------画线----------
For i = 0 To UBound(LineS)
    If Len(LineS(i)) > 5 Then
        fj = Split(LineS(i), ",")
        If UBound(fj) > 2 Then
            pp.Line (lefts + fj(0), tops + fj(1))-(lefts + fj(2), tops + fj(3)), 0
        End If
    End If
Next i

End Sub
Private Sub viewtext(cs As String, obj As Object, lefts As Long, tops As Long)
'传进来的数据格式为: X1,Y1,X2,Y2,显示内容,[字体[,字号]]
'字体为可选,字号也为可选,如果需要指定字号,就必须指定字体

On Error Resume Next

Dim fj() As String
Dim vx As Long, vy As Long
Dim Fx As Long, Fy As Long
Dim hx As Long, hy As Long
Dim m As String, n As String
Dim i As Long, j As Long, k As Long
Dim o As Long
Dim H() As String

    fj = Split(cs, ",")             '分解传进来的参数
    If UBound(fj) > 4 Then          '有字体设置
        If Len(fj(5)) > 0 Then      '字体名不为空
            obj.FontName = fj(5)
        End If
    Else
        obj.FontName = "宋体"       '默认为宋体
    End If
   
    If UBound(fj) > 5 Then          '有字号设置
        If Val(fj(6)) > 2 Then      '字号最小不得小于2
            obj.FontSize = fj(6)
        End If
    Else
        obj.FontSize = 字体大小
    End If
   
    Fy = obj.TextHeight(fj(4))           '字体高
    Fx = obj.TextWidth(fj(4))            '字体宽
   
    hx = Val(fj(2)) - Val(fj(0))        '有效宽
    hy = Val(fj(3)) - Val(fj(1))        '有效高
   
    If Fx > hx Or InStr(1, fj(4), "\") > 0 Then         '如果需要换行或人工指定的多多行
        
        If InStr(1, fj(4), "\") > 0 Then                '如果人工指定的多多行
            H = Split(fj(4), "\")                       '直接分解为每一行
            k = UBound(H)                '取行数
        Else
        
            k = Fx / hx          '计算需要分成多少行
            
            ReDim H(k)
            i = 0
            j = 1
            o = 1
            Do
                H(i) = Mid(fj(4), j, o)                     '一个字符一个字符的试下去
                If obj.TextWidth(H(i)) > hx - 100 Then      '试到撑满格子为止
                    j = j + o                               '本行结束,保存各变量
                    o = 1
                    i = i + 1
                Else
                    o = o + 1                               '本行未结束,长度加一,继续试下去
                End If
               
            Loop While j + o < Len(fj(4)) + 2           '<原来就 要加1,因为循环前是o+1,所以这里要再加1
        
        End If
        
        For i = 0 To k                          '处理每一行
      
            Fx = obj.TextWidth(H(i))            '字体宽
            vx = lefts + Val(fj(0)) + (hx - Fx) / 2
            vy = tops + Val(fj(1)) + (hy - Fy * (k + 1 + (k) * 0.2)) / 2 + Fy * (i) * 1.2           '行距为1.2,总高度为 行数*1+(行数-1)*0.2
            obj.CurrentX = vx
            obj.CurrentY = vy
            obj.Print H(i)
        
        Next i
   
    Else                    '没有多行,直接计算坐标显示
        vx = lefts + Val(fj(0)) + (hx - Fx) / 2
        vy = tops + Val(fj(1)) + (hy - Fy) / 2
        obj.CurrentX = vx
        obj.CurrentY = vy
        obj.Print fj(4)
    End If
End Sub

----------------------------------
;设置文件:建议卡A4设置
; 11904 ,,,宽A4
; 16836 ,,,高A4

;9636    有效宽A4
;14568   有效高A4

[Page]
;纸芯宽
Width=9636
;纸芯高
Height=14568
;默认字体大小
FontSize=12

[Line]
;格式为 x1,y1,x2,y2

;横线
50,1000,9600,1000
50,1800,9600,1800
750,2600,9600,2600
750,3400,9600,3400
50,4200,9600,4200
50,5000,9600,5000
2400,5800,9600,5800
2400,6600,9600,6600
2400,7400,9600,7400
50,8200,9600,8200
2400,9000,9600,9000
2400,9800,9600,9800
2400,10600,9600,10600
50,11400,9600,11400
;50,12200,9600,12200

;竖线
50,1000,50,11400
750,1000,750,11400
2400,1800,2400,11400
3900,1000,3900,11400
5400,1000,5400,4200
6900,1000,6900,4200
8400,1000,8400,4200
9600,1000,9600,11400

[Fixed]
;固定显示部分
;格式: x1,y1,x2,y2,显示内容[,字体[,字号]]   
;字体和字号为可选,但有字号,就必须要有字体

50,1000,750,1800,地点
3900,1000,5400,1800,农户姓名
50,1800,750,4200,土壤\养分\情况

[Date]
;填表的数据
;警告,不要修改以下标题
;格式: x1,y1,x2,y2,显示内容[,字体[,字号]]   
;字体和字号为可选,但有字号,就必须要有字体

0,0,9636,800,施肥建议卡标题,黑体,20

授人于鱼,不如授人于渔
早已停用QQ了
2010-10-18 07:59
hsbwp1314
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:88
专家分:25
注 册:2008-12-1
收藏
得分:0 
回复 5楼 风吹过b
班主,你能帮我看看我那问题出在那里吗?我是菜了,你那代码确认好,逻辑性太强,我那虽然多,但是简单,求你帮忙了,谢谢
2010-10-18 08:29
zmh886
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:238
专家分:1305
注 册:2010-6-2
收藏
得分:10 
下了你的代码 调试了下
for那行改成
    c = j * N
    If c > MSFlexGrid1.Rows - 1 Then c = MSFlexGrid1.Rows - 1
    For i = k To c   'm - (ii - j) * N + 1  '

http://www./
2010-10-18 15:01
zmh886
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:238
专家分:1305
注 册:2010-6-2
收藏
得分:0 
错误原因 第2页已经没有23条记录了 却让它循环到46 所以出错

http://www./
2010-10-18 15:05
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4940
专家分:30047
注 册:2008-10-15
收藏
得分:0 
Public Sub 打印报表(cs1 As Form, cs2 As String, cs3 As String, Optional cs As Boolean, Optional cs4 As String = "", Optional cs5 As Boolean = True)
'cs1 要打印的窗体
'cs2 设置文件名
'cs3 打印的标题
'cs =ture 表示模拟显示 flase 表示输出到打印机
'cs4 表示附加要打印的内容,打印到标题下面,自动会加上页码和总页数
'cs5 表示是否要打印部门名 ture 表示要打印

'以下两行是为了调试用
'    On Error Resume Next
'    Dim sc As PictureBox
   
'改变鼠标形状
Call mi
   
'定义最关键的变量
    Dim sc As Object
    Dim fr As Form

'检查是否可以进行打印

If cs1.ListView1.ListItems.Count < 1 Then
    MsgBox "未发现要打印的内容!", vbCritical
    Exit Sub
End If

If cs Then
'显示模拟显示
    Set fr = New 模拟显示
    fr.Show
    Call fr.savebl(cs1, cs2, cs3, cs, cs4, cs5)
Else
'设置打印机
    If Printers.Count > 0 Then
        Set sc = Printer
    Else
        MsgBox "系统未发现打印机,无法进行打印!", vbCritical
        Exit Sub
    End If
End If

'可以打印,定义其它所有的变量

Dim tt As String    '标题
Dim 上边距 As Long
Dim 左边距 As Long
Dim 下边距 As Long
Dim 右边距 As Long
Dim 页数 As Long
Dim 行数 As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim wz() As Long   '各字段的位置
Dim 本页 As Long    '本页实际行数
Dim 间隔 As Long    '每一线在当前字段之前多少
Dim zs As Long      '共几个字段

Dim 页宽 As Long
Dim 页高 As Long


'设置并读取对应的字段坐标
zs = cs1.ListView1.ColumnHeaders.Count
ReDim wz(zs + 1)
For i = 1 To zs + 1
    wz(i) = Val(Rini(cs2, Str(i), 系统路径 & "fg.ini"))
Next i

'一些设置
   
    间隔 = 100

    页高 = Val(Rini("页面设置", "长", 系统路径 & "fg.ini"))
    页宽 = Val(Rini("页面设置", "宽", 系统路径 & "fg.ini"))
    左边距 = Val(Rini("页面设置", "左", 系统路径 & "fg.ini"))
    右边距 = Val(Rini("页面设置", "右", 系统路径 & "fg.ini"))
    上边距 = Val(Rini("页面设置", "上", 系统路径 & "fg.ini"))
    下边距 = Val(Rini("页面设置", "下", 系统路径 & "fg.ini"))
   
If cs Then
    fr.Picture2.Width = 页宽
    fr.Picture2.Height = 页高
End If

'计算行数和总页数
行数 = (页高 - 上边距 - 下边距 - 1100) / 300

页数 = Int(cs1.ListView1.ListItems.Count / 行数)
If 页数 <> cs1.ListView1.ListItems.Count / 行数 Then 页数 = 页数 + 1

'合成标题
If cs5 Then
    tt = "上高红颜" & IIf(登录部门 = 0, "一部", "二部") & cs3
Else
    tt = "上高红颜" & cs3
End If


If cs Then fr.Caption = tt

For i = 1 To 页数

    '加载页面或换纸
    If cs Then
        'Call fr.载入(i, 页高, 页宽)
        'Call fr.载入
        'Set sc = fr.xxx(i)
        Set sc = fr.载入
    Else
        If i > 1 Then
            sc.NewPage
        End If
    End If

    '执行输出
    With sc
        '显示标题
        .Font.Size = 12
        .CurrentX = 左边距 + (wz(zs + 1) - wz(1) - lenstr(tt) * 140) / 2 + wz(1)
        '(10206 - lenstr(tt) * 240) / 2
        .CurrentY = 上边距
        sc.Print tt
   
        .Font.Size = 9
        
        '显示附加数据和页码
            .CurrentX = 500 + 左边距
            .CurrentY = 500 + 上边距
            sc.Print cs4 & Space(10) & "共 " & 页数 & " 页 第 " & i & " 页"
        
        '显示表格头
        For k = 1 To zs
            .CurrentX = wz(k) + 左边距
            .CurrentY = 800 + 上边距
            sc.Print cs1.ListView1.ColumnHeaders(k).Text
        Next k
        
        '画表格头上面的线
        sc.Line (wz(1) - 间隔 + 左边距, 750 + 上边距)-(wz(zs + 1) - 间隔 + 左边距, 750 + 上边距)
        
        '计算本页的实际行数
        本页 = cs1.ListView1.ListItems.Count - ((i - 1) * 行数)
        If 本页 > 行数 Then 本页 = 行数
   
        '显示内容
        For j = 1 To 本页
        '显示序号
            .CurrentX = wz(1) + 左边距
            .CurrentY = 800 + 上边距 + 300 * j
            sc.Print cs1.ListView1.ListItems(j + (行数 * (i - 1))).Text
            '显示内容
            For k = 1 To zs - 1
                .CurrentX = wz(k + 1) + 左边距
                .CurrentY = 800 + 上边距 + 300 * j
                sc.Print cs1.ListView1.ListItems(j + (行数 * (i - 1))).SubItems(k)
            Next k
        
            '画每一行上面的线
            sc.Line (wz(1) - 间隔 + 左边距, j * 300 + 750 + 上边距)-(wz(zs + 1) - 间隔 + 左边距, j * 300 + 750 + 上边距)
        Next j
        
        '画合计下的线
        sc.Line (wz(1) - 间隔 + 左边距, j * 300 + 750 + 上边距)-(wz(zs + 1) - 间隔 + 左边距, j * 300 + 750 + 上边距)
        
        '画各根竖线
        For k = 1 To zs + 1
            sc.Line (wz(k) - 间隔 + 左边距, 750 + 上边距)-(wz(k) - 间隔 + 左边距, j * 300 + 750 + 上边距)
        Next k
   
    End With

Next i

If cs Then
    fr.页数 = 1
'    fr.总页数 = 页数
    Call fr.刷新
Else
    sc.EndDoc
End If

'改变鼠标形状
Call mi

End Sub


2003年写的一个代码,你参考一下,可能有错误。现在都不愿去动 VB6 了。

授人于鱼,不如授人于渔
早已停用QQ了
2010-10-18 18:45
hsbwp1314
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:88
专家分:25
注 册:2008-12-1
收藏
得分:0 
谢谢,
2010-10-18 19:58
快速回复:班主任,我这个下标越界,能帮我看看吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035250 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved