Lỗi code khi sử dụng Form in

Liên hệ QC

quanglenb

Thành viên hoạt động
Tham gia
2/11/19
Bài viết
136
Được thích
25
Em chào thầy (cô), anh (chị) trên GPE.
Em có sưu tầm được Form in trên diễn đàn GPE.
Em lắp vào file để sử dụng, do em không biết về code thấy báo lỗi.
Nhờ các thầy (cô), anh(chị) sửa giúp em code để có thể in được.
Em xin chân thành cảm ơn!
Code em sử dụng trong form:
Mã:
Private Sub CommandButton1_Click()

BBLM.Hide

    Dim a As Integer

    Dim b As Integer

    Dim N As Long, NameSh As String

NameSh = ActiveSheet.Name

If NameSh = "Bang" Then

    a = TextBox1

    b = TextBox2

       For a = a To b

        Range("G8") = a

        FixRow Range("D11,D12,D13,D14,D15")

        'ActiveWindow.SelectedSheets.PrintPreview

        ActiveWindow.SelectedSheets.PrintOut , ActivePrinter:=ComboBox1, Copies:=1, Collate:=True

    Next

Else

    'ActiveWindow.SelectedSheets.PrintPreview

    ActiveWindow.SelectedSheets.PrintOut , ActivePrinter:=ComboBox1, Copies:=1, Collate:=True

End If

End Sub

Private Sub CommandButton2_Click()

    Unload Me

End Sub

Sub List_Printer()

    Dim aPrinters As Object

    Dim I As Long, N As Long

    With CreateObject("WScript.Network")

        Set aPrinters = .EnumPrinterConnections

        For I = 1 To aPrinters.Count Step 2

            ComboBox1.AddItem aPrinters.Item(I)

        Next

    End With

End Sub

Sub Get_Default_Printer()

    Dim WSHshell As Object, RegKey As String, RegKeySplit As Variant

    Dim RegDefault As String, MyPrinter As String

    RegKey = _

            "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"

    Set WSHshell = CreateObject("WScript.Shell")

    RegDefault = WSHshell.RegRead(RegKey)

    Set WSHshell = Nothing

    'Get name default printer:

    RegKeySplit = Split(RegDefault, ",")

    MyPrinter = RegKeySplit(0)

    ComboBox1.Text = MyPrinter

End Sub

Private Sub Printer_Properties_Click()

    Call Shell("rundll32 printui.dll,PrintUIEntry /p /n """ & ComboBox1.Value & """", vbNormalFocus)

End Sub

Private Sub UserForm_Initialize()

    Call List_Printer

    Call Get_Default_Printer

End Sub


loid.pngloic.png
 

File đính kèm

  • In.xlsm
    36.1 KB · Đọc: 5
Lần chỉnh sửa cuối:
Em chào thầy (cô), anh (chị) trên GPE.
Em có sưu tầm được Form in trên diễn đàn GPE.
Em lắp vào file để sử dụng, do em không biết về code thấy báo lỗi.
Nhờ các thầy (cô), anh(chị) sửa giúp em code để có thể in được.
Em xin chân thành cảm ơn!
Code em sử dụng trong form:
Mã:
Private Sub CommandButton1_Click()

BBLM.Hide

    Dim a As Integer

    Dim b As Integer

    Dim N As Long, NameSh As String

NameSh = ActiveSheet.Name

If NameSh = "Bang" Then

    a = TextBox1

    b = TextBox2

       For a = a To b

        Range("G8") = a

        FixRow Range("D11,D12,D13,D14,D15")

        'ActiveWindow.SelectedSheets.PrintPreview

        ActiveWindow.SelectedSheets.PrintOut , ActivePrinter:=ComboBox1, Copies:=1, Collate:=True

    Next

Else

    'ActiveWindow.SelectedSheets.PrintPreview

    ActiveWindow.SelectedSheets.PrintOut , ActivePrinter:=ComboBox1, Copies:=1, Collate:=True

End If

End Sub

Private Sub CommandButton2_Click()

    Unload Me

End Sub

Sub List_Printer()

    Dim aPrinters As Object

    Dim I As Long, N As Long

    With CreateObject("WScript.Network")

        Set aPrinters = .EnumPrinterConnections

        For I = 1 To aPrinters.Count Step 2

            ComboBox1.AddItem aPrinters.Item(I)

        Next

    End With

End Sub

Sub Get_Default_Printer()

    Dim WSHshell As Object, RegKey As String, RegKeySplit As Variant

    Dim RegDefault As String, MyPrinter As String

    RegKey = _

            "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"

    Set WSHshell = CreateObject("WScript.Shell")

    RegDefault = WSHshell.RegRead(RegKey)

    Set WSHshell = Nothing

    'Get name default printer:

    RegKeySplit = Split(RegDefault, ",")

    MyPrinter = RegKeySplit(0)

    ComboBox1.Text = MyPrinter

End Sub

Private Sub Printer_Properties_Click()

    Call Shell("rundll32 printui.dll,PrintUIEntry /p /n """ & ComboBox1.Value & """", vbNormalFocus)

End Sub

Private Sub UserForm_Initialize()

    Call List_Printer

    Call Get_Default_Printer

End Sub


View attachment 230046View attachment 230047
Nhìn thấy cái foxz trong hình do vậy mình không tải file đính kèm. Lỗi như hình là file không có Sub Fixrow
 
Để em cài Kaspersky Internet Security bản quyền và diệt Virus rồi tải lại file anh giúp em mới nhé!
Anh có thể cho em xin code cái Sub Fixrow được không ạ?
Cám ơn anh!
Search trên diễn đàn không rỏ code của bạn nào
Mã:
Sub FixRow(ByVal rng As Range)
    Dim Ws As Worksheet
    Dim I As Long, cell As Range, MrgeWdth As Single, Ma As Range
    Dim WithCellPaste As Long, ColPaste As Long, RowPaste As Long, CellPaste As Range, Diff As Single
    On Error Resume Next
    Diff = 0.75
    Set Ws = rng.Worksheet
    ColPaste = Ws.Columns.Count
    For I = 1 To rng.Count
        If rng(I) <> Empty Then
            Set Ma = rng(I).MergeArea
            For Each cell In Ma
                MrgeWdth = MrgeWdth + cell.ColumnWidth + Diff
            Next cell
            Ma.RowHeight = 16.5
            RowPaste = Ma.row
            Set CellPaste = Cells(RowPaste, ColPaste)
            WithCellPaste = CellPaste.ColumnWidth
            CellPaste.ColumnWidth = MrgeWdth
            CellPaste = Ma.Value
            rng(I, 1).Copy
            CellPaste.PasteSpecial xlPasteFormats
            CellPaste.WrapText = True
            CellPaste.EntireRow.AutoFit
            Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
            CellPaste.Clear
            CellPaste.ColumnWidth = WithCellPaste
        End If
    Next I
End Sub
 
Search trên diễn đàn không rỏ code của bạn nào
Mã:
Sub FixRow(ByVal rng As Range)
    Dim Ws As Worksheet
    Dim I As Long, cell As Range, MrgeWdth As Single, Ma As Range
    Dim WithCellPaste As Long, ColPaste As Long, RowPaste As Long, CellPaste As Range, Diff As Single
    On Error Resume Next
    Diff = 0.75
    Set Ws = rng.Worksheet
    ColPaste = Ws.Columns.Count
    For I = 1 To rng.Count
        If rng(I) <> Empty Then
            Set Ma = rng(I).MergeArea
            For Each cell In Ma
                MrgeWdth = MrgeWdth + cell.ColumnWidth + Diff
            Next cell
            Ma.RowHeight = 16.5
            RowPaste = Ma.row
            Set CellPaste = Cells(RowPaste, ColPaste)
            WithCellPaste = CellPaste.ColumnWidth
            CellPaste.ColumnWidth = MrgeWdth
            CellPaste = Ma.Value
            rng(I, 1).Copy
            CellPaste.PasteSpecial xlPasteFormats
            CellPaste.WrapText = True
            CellPaste.EntireRow.AutoFit
            Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
            CellPaste.Clear
            CellPaste.ColumnWidth = WithCellPaste
        End If
    Next I
End Sub
Cảm ơn anh! chúc anh buổi tối vui vẻ!
 
Em cám ơn anh, nhờ anh giải thích giúp em:
Mã:
....
Diff = 0.75
.....
Ma.RowHeight = 16.5
.....
Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
......
Có ý nghĩa và tác dụng như thế nào được không ạ?
Em muốn chỉnh để sao cho khi Fix thì khoảng cách từ nội dung đến khung viền bao có thể thay đổi được thì điều chỉnh phần thông số nào trong code trên vậy anh?
Em cảm ơn anh!
Bài đã được tự động gộp:

Em cám ơn anh, nhờ anh giải thích giúp em:
Mã:
....
Diff = 0.75
.....
Ma.RowHeight = 16.5
.....
Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
......
Có ý nghĩa và tác dụng như thế nào được không ạ?
Em muốn chỉnh để sao cho khi Fix thì khoảng cách từ nội dung đến khung viền bao có thể thay đổi được thì điều chỉnh phần thông số nào trong code trên vậy anh?
Em cảm ơn anh!
Nhờ anh @Nhất Chi Lan giái thích và giúp em mới!
Hình như code này của @Nhất Chi Lan .
 
Em cám ơn anh, nhờ anh giải thích giúp em:
Mã:
....
Diff = 0.75
.....
Ma.RowHeight = 16.5
.....
Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
......
Có ý nghĩa và tác dụng như thế nào được không ạ?
Em muốn chỉnh để sao cho khi Fix thì khoảng cách từ nội dung đến khung viền bao có thể thay đổi được thì điều chỉnh phần thông số nào trong code trên vậy anh?
Em cảm ơn anh!
Bài đã được tự động gộp:


Nhờ anh @Nhất Chi Lan giái thích và giúp em mới!
Hình như code này của @Nhất Chi Lan .
Bạn điều chỉnh số màu đỏ đến khi vừa ý
Thông số chiều rộng cột: Diff = 0.75
Thông số chiều cao dòng: Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
Lệnh Ma.RowHeight = 16.5 nhằm trả về chiều cao tối thiểu mặc định của Excel, có thể chỉnh xuống 14.4
Nếu chiều cao của dòng lúc nầy lúc khác thì thêm lệnh
For Each cell In Ma
MrgeWdth = MrgeWdth + cell.ColumnWidth + Diff
Next cell
MrgeWdth = MrgeWdth - Diff
 
Bạn điều chỉnh số màu đỏ đến khi vừa ý
Thông số chiều rộng cột: Diff = 0.75
Thông số chiều cao dòng: Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
Lệnh Ma.RowHeight = 16.5 nhằm trả về chiều cao tối thiểu mặc định của Excel, có thể chỉnh xuống 14.4
Nếu chiều cao của dòng lúc nầy lúc khác thì thêm lệnh
For Each cell In Ma
MrgeWdth = MrgeWdth + cell.ColumnWidth + Diff
Next cell
MrgeWdth = MrgeWdth - Diff
Em cảm ơn anh!
Thông số chiều rộng cột: Diff = 0.75
Thông số chiều cao dòng: Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
Anh cho em hỏi rõ hơn ạ?
0.75 ở trên là thông số chiều rộng cột có nghĩa là sao ạ? em chưa hình dung được nó có phải là khoảng cách từ nội dung đến khung bao bên trái hoặc bên phải không ạ?
Bài đã được tự động gộp:

Search trên diễn đàn không rỏ code của bạn nào
Mã:
Sub FixRow(ByVal rng As Range)
    Dim Ws As Worksheet
    Dim I As Long, cell As Range, MrgeWdth As Single, Ma As Range
    Dim WithCellPaste As Long, ColPaste As Long, RowPaste As Long, CellPaste As Range, Diff As Single
    On Error Resume Next
    Diff = 0.75
    Set Ws = rng.Worksheet
    ColPaste = Ws.Columns.Count
    For I = 1 To rng.Count
        If rng(I) <> Empty Then
            Set Ma = rng(I).MergeArea
            For Each cell In Ma
                MrgeWdth = MrgeWdth + cell.ColumnWidth + Diff
            Next cell
            Ma.RowHeight = 16.5
            RowPaste = Ma.row
            Set CellPaste = Cells(RowPaste, ColPaste)
            WithCellPaste = CellPaste.ColumnWidth
            CellPaste.ColumnWidth = MrgeWdth
            CellPaste = Ma.Value
            rng(I, 1).Copy
            CellPaste.PasteSpecial xlPasteFormats
            CellPaste.WrapText = True
            CellPaste.EntireRow.AutoFit
            Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
            CellPaste.Clear
            CellPaste.ColumnWidth = WithCellPaste
        End If
    Next I
End Sub
Thầy @SA_DQ giải thích sơ qua giúp em đoạn code mà anh @HieuCD đã giúp em, giống như thầy đã phiên dịch code bài gần đây!
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Bạn điều chỉnh số màu đỏ đến khi vừa ý
Thông số chiều rộng cột: Diff = 0.75
Thông số chiều cao dòng: Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
Lệnh Ma.RowHeight = 16.5 nhằm trả về chiều cao tối thiểu mặc định của Excel, có thể chỉnh xuống 14.4
Nếu chiều cao của dòng lúc nầy lúc khác thì thêm lệnh
For Each cell In Ma
MrgeWdth = MrgeWdth + cell.ColumnWidth + Diff
Next cell
MrgeWdth = MrgeWdth - Diff
Anh ơi chỉnh thông số đó như thế nào để Fix chiều cao được đẹp nhất vậy anh?
 
Em cảm ơn anh!
Thông số chiều rộng cột: Diff = 0.75
Thông số chiều cao dòng: Ma.RowHeight = CellPaste.RowHeight + 16.5 / 5
Anh cho em hỏi rõ hơn ạ?
0.75 ở trên là thông số chiều rộng cột có nghĩa là sao ạ? em chưa hình dung được nó có phải là khoảng cách từ nội dung đến khung bao bên trái hoặc bên phải không ạ?
Bài đã được tự động gộp:


Thầy @SA_DQ giải thích sơ qua giúp em đoạn code mà anh @HieuCD đã giúp em, giống như thầy đã phiên dịch code bài gần đây!
Em cảm ơn!
Anh ơi chỉnh thông số đó như thế nào để Fix chiều cao được đẹp nhất vậy anh?
cell.ColumnWidth là chiều rộng của cột không tính đường biên, Khi gộp 2 ô thành 1 sẽ mất 1 đường biên nên phải cộng thêm Diff, giá trị Diff là bao nhiêu mình không biết, hình như lớn hơn 0.75 một chút, bạn cứ thử tăng giảm đến khi vừa ý thì ngừng
 
Thầy @SA_DQ giải thích sơ qua giúp em đoạn code mà anh @HieuCD đã giúp em, giống như thầy đã phiên dịch code bài gần đây! Em cảm ơn!
Bạn này nhờ làm chuyện trái khoáy Mà tác gia sờ sờ ra đấy lại không nhờ, thiệt tình!
Mình chưn ướt chưn ráo lại phải tốn thời gian dọc lại từ đầu!
Bạn chờ sau Tết nha, nếu không được tác gia diễn dịch cho!
 
cell.ColumnWidth là chiều rộng của cột không tính đường biên, Khi gộp 2 ô thành 1 sẽ mất 1 đường biên nên phải cộng thêm Diff, giá trị Diff là bao nhiêu mình không biết, hình như lớn hơn 0.75 một chút, bạn cứ thử tăng giảm đến khi vừa ý thì ngừng
Vâng em cảm ơn anh!
 
Web KT
Back
Top Bottom