Xin được giúp đỡ

Liên hệ QC

VADaNang

Thành viên chính thức
Tham gia
4/12/06
Bài viết
65
Được thích
47
1/Tôi có chương trình viết bằng VBA làm thế nào khi copy file đó qua máy khác thì các chương trình chạy bình thường nếu không cài vào máy đó chương trình VB6.
2/ Cách nào ghi dữ liệu vào 1 ô mà ta có được kết quả có gạch dưới của 1 chữ nào đó trong một chuỗi chữ , ví dụ : Ta ghi vào Cells(1,1) được kết quả như sau:
Hạng mục(có gạch chân dưới) : Nhà A (không có gạch chân dưới)
3/ Cách viết thủ tục trong module làm cho 1 sheet tự động tính toán (Chẳng hạn khi nhập số vào Cells(1,1)=2; Cells(1,2)=3 then
Cells(1,3)=Cells(1,1)xCells(1,2)=6
hoặc thay đổi giá trị Cells(1,1)=3; Cells(1,2)=3 then Cells(1,3) có kết quả =9 .v..v)
khi ta thay đổi số liệu trong 1 sheets giống như thủ tục change cho worksheet nằm trong Viewcode
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
......
End Sub
Xin cám ơn.
 
VADaNang đã viết:
1/Tôi có chương trình viết bằng VBA làm thế nào khi copy file đó qua máy khác thì các chương trình chạy bình thường nếu không cài vào máy đó chương trình VB6.
.
Tôi nghĩ chạy VBA đâu có phụ thuộc vào máy có cài VB hay là không đâu. Chỉ cần cài đầy đủ Office là được mà.
VADaNang đã viết:
2/ Cách nào ghi dữ liệu vào 1 ô mà ta có được kết quả có gạch dưới của 1 chữ nào đó trong một chuỗi chữ , ví dụ : Ta ghi vào Cells(1,1) được kết quả như sau:
Hạng mục(có gạch chân dưới) : Nhà A (không có gạch chân dưới)
Để bôi đen, hay gạch dưới …. một dữ liệu kiểu text trong một ô tôi thường dùng như sau
VD tại ô B15 : Xử lý từ ký tự thứ 5 đến ký tự 12 (8 ký tự)

PHP:
 Range("B15").Select
      With ActiveCell.Characters(Start:=5, Length:=8).Font
          .Name = "Times New Roman"
          .FontStyle = "Regular"
          .Size = 13
          .Strikethrough = False
          .Superscript = False
          .Subscript = False
          .OutlineFont = False
          .Shadow = False
          .Underline = xlUnderlineStyleNone
          .ColorIndex = xlAutomatic
      End With
Điều quan trọng là bạn phải biết được rằng mình phải xử lý từ ký tự thứ mấy đến thứ mấy (dùng hàm excel tính ra cũng được)
VADaNang đã viết:
3/ Cách viết thủ tục trong module làm cho 1 sheet tự động tính toán (Chẳng hạn khi nhập số vào Cells(1,1)=2; Cells(1,2)=3 then
Cells(1,3)=Cells(1,1)xCells(1,2)=6
hoặc thay đổi giá trị Cells(1,1)=3; Cells(1,2)=3 then Cells(1,3) có kết quả =9 .v..v)
khi ta thay đổi số liệu trong 1 sheets giống như thủ tục change cho worksheet nằm trong Viewcode
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
......
End Sub
Xin cám ơn.
Mã:
  Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   
  With Application
          .Calculation = xlAutomatic
      End With
   
  End Sub
  [COLOR=Red]Hủy tự động tính toán[/COLOR]
  With Application
          .Calculation = xlManual
  End With
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
VADaNang
Trước hết mình rất cám ơn sự quan tâm giúp đỡ của bạn.
+Tuy nhiên đối với câu hỏi 3 mình chưa nắm rõ cách hướng dẫn của bạn. Đối trường hợp 3 ý mình :
Mình đã có 1 file trong đó có bảng tính tên là “Sheet1” sau đó mình đã viết thêm các đoạn mã nằm trong “Viewcode” của sheet1 chẳng hạn
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) =so1 * so2
End Sub
Như vậy mỗi lần đưa số vào ô cột 1 và ô cột 2 thì sẽ có tích của ô cột 3 (Tự động tính ô1 x ô2). Nhưng ngẹt là thủ tục này chỉ nằm tại “Viewcode” của sheet1 .
Mình không biết viết thủ tục như thế nào cho vào module mà được như ý muốn trên.
 
Upvote 0
Theo mình được biết thì bất cứ sự thay đổi nào của Sh 1 thì thủ tục sẽ được thi hành (Dĩ nhiên macro phải được enable)
Sau đây là một VD về thủ tục này (lấy từ file “Nhat ky chung” trên diễn đàn)

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 5 And Target.Column = 3 Then
        Application.EnableEvents = False
 ……………………….
        Application.EnableEvents = True
    End If
End Sub
 
Upvote 0
Chẳng hạn
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) =so1 * so2
End Sub
Như vậy mỗi lần đưa số vào ô cột 1 và ô cột 2 thì sẽ có tích của ô cột 3 (Tự động tính ô1 x ô2). Nhưng ngẹt là thủ tục này chỉ nằm tại “Viewcode” của sheet1 .
Mình không biết viết thủ tục như thế nào cho vào module mà được như ý muốn trên.
Ý bạn muốn cái nào trong hai trường hợp sau:
Mã:
Option Explicit[b]
Private Sub Worksheet_Change(ByVal Target As Range)[/b]
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        If Target.Value Mod 2 = 0 Then
1[color="blue"]' Thực hiện tại chỗ [/color]
            Target.Offset(0, 1).Value = Target.Value * Target.Offset(0, -1).Value
         Else
2[color="blue"]' Chuyển sang Module1 thực hiện [/color]
           WChange Target.Offset(0, 1), Target.Value, Target.Offset(0, -1).Value
    End If:                 End If 
[b]End Sub [/b]
Mã:
[b]
Sub WChange(Rng As Range, Num1 As Variant, Num2 As Variant)[/b] 
    Rng.Value = Num1 * Num2[b]
End Sub[/b]
 
Lần chỉnh sửa cuối:
Upvote 0
Mình diễn đạt rất dỡ nên các bạn khó hiểu. Mong thông cảm.
Thôi thì mình gởi lên 2 file. Trong đó :
+ 1 file có tên “Chayduoc.xls” là có thủ tục Worksheet_Change trong Viewcode hoạt động được ý muốn.
+ Còn 1 file có tên “Khongchayduoc.xls” có thủ tục Worksheet_Change nằm trong module thì không chạy được.
 

File đính kèm

  • Chayduoc.xls
    21.5 KB · Đọc: 21
  • KhongChayduoc.xls
    19 KB · Đọc: 14
Upvote 0
Bạn chú ý:
Mã:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) = so1 * so2
End Sub
Đây là sự kiện mỗi khi bạn di chuyển trong một sheet. Nếu bạn đặt thủ tục (Sub) này trong một module thì thủ tục này hoàn toàn không có tác dụng mỗi khi bạn di chuyển trong một sheet.
Đó là lý do tại sao một thì "chạy" theo ý của bạn, một thì không.

Lê Văn Duyệt
 
Upvote 0
levanduyet đã viết:
Bạn chú ý:
Mã:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) = so1 * so2
End Sub
Đây là sự kiện mỗi khi bạn di chuyển trong một sheet. Nếu bạn đặt thủ tục (Sub) này trong một module thì thủ tục này hoàn toàn không có tác dụng mỗi khi bạn di chuyển trong một sheet.
Đó là lý do tại sao một thì "chạy" theo ý của bạn, một thì không.

Lê Văn Duyệt
Chính vì vậy bạn phải tạo ra một Sub con trong module (VD tên là :TEST).
VD Tên sheet (trong VBA) là S01
Sub test()
S01.select
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) = so1 * so2
End Sub


Sau đó mới sử dụng trong sheet

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
call TEST
End Sub
 
Upvote 0
MrHieu đã viết:
Chính vì vậy bạn phải tạo ra một Sub con trong module (VD tên là :TEST).
VD Tên sheet (trong VBA) là S01
Sub test()
S01.select
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) = so1 * so2
End Sub


Sau đó mới sử dụng trong sheet

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
call TEST
End Sub

Nếu như trong file bạn gửi lên sẽ là:
PHP:
Sub test()
Sheet1.Select
Hang = Target.Row
so1 = Cells(Hang, 1)
so2 = Cells(Hang, 2)
Cells(Hang, 3) = so1 * so2
End Sub
Mã:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Call test
End Sub

Nhưng tớlàm nó vẫn không chạy, nó báo lỗi đây
Hang = Target.Row
 
Upvote 0
Cám ơn các bạn. Đúng là ý mình không muốn các thủ tục nằm trong Viewcode của ngay sheet đó chỉ toàn nằm trong modules.
Còn đoạn mã của bạn Hiếu đưa lên chắc có lẻ bạn hơi làm vội không qua kiểm tra. Mình xin phép bạn Hiếu mình chỉnh lại mã một chút .

PHP:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim hang  As Integer
        hang = Target.Row
        Call test(hang)
End Sub
Sub test(gg As Integer)
        so1 = Sheet1.Cells(gg, 1)
        so2 = Sheet1.Cells(gg, 2)
        Sheet1.Cells(gg, 3) = so1 * so2
End Sub
 
Upvote 0
Mình cũng chưa kịp kiểm tra. Do mình vội quá. Cảm ơn VADaNang nhé.
 
Upvote 0
Không có chi. Mình mới gia nhập, thấy các bạn hết sức quan tâm giúp đỡ lẫn nhau là vui rồi chứ chuyện đó ai tài giỏi chi.
 
Upvote 0
Web KT
Back
Top Bottom