Dùng VB kết hợp với Excel (1 người xem)

  • Thread starter Thread starter sonktc
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

sonktc

Thành viên chính thức
Tham gia
30/9/07
Bài viết
59
Được thích
3
Tôi có 1 form trên ấy có 4 textbox và 1 nút nhấn, với textbox1 là nhập số A, tương tự tetxtbox2 là nhập số B, tetxtbox3 là nhập số c và textbox4 là cho kết quả trung bình.
(Ax2 +Bx4 + Cx3)/9
Có cách nào để để cho file VB liên kết với 1 file excel, để khi cần thay đỗi các hệ số 2,4,3 và số chia 9 thì mình sẻ chỉnh trên file excel mà không phải chỉnh lại code của nút nhấn
Nút nhấn này khi nhấn vào sẻ cho kết quả ở textbox4
 
Cho các hệ số trên ở Excel thí dụ Sheet1, cell A1, B1, C1
Code của nút nhấn sẽ là:

PHP:
Sub commandbutton1_click
 
Dim hs1 as byte, hs2 as byte, hs3 as byte
hs1=range("sheet1!A1").value
hs2=range("sheet1!B1").value
hs3=range("sheet1!C1").value
 
Me.textbox4 = (Me.textbox1*hs1 +Me.textbox2*hs2+Me.textbox3*hs3)/(hs1+hs2+hs3)
End Sub
 
(Me.textbox1*hs1 +Me.textbox2*hs2+Me.textbox3*hs3)
Công thức này chính là SUMPRODUCT, nhưng ko biết trong VBA viết thế nào? Hay vẫn là Application.WorksheetFunction... nhỉ?
Vì nếu nó có chừng 20 đối tượng mà cộng thế e rằng hơi bị.. xịt...
ANH TUẤN
 
ngocmaipretty đã viết:
Cho các hệ số trên ở Excel thí dụ Sheet1, cell A1, B1, C1
Code của nút nhấn sẽ là:

PHP:
Sub commandbutton1_click
 
Dim hs1 as byte, hs2 as byte, hs3 as byte
hs1=range("sheet1!A1").value
hs2=range("sheet1!B1").value
hs3=range("sheet1!C1").value
 
Me.textbox4 = (Me.textbox1*hs1 +Me.textbox2*hs2+Me.textbox3*hs3)/(hs1+hs2+hs3)
End Sub
Chú ý xíu :
  1. Địa chỉ range sai
  2. Textbox.Value là ký tự, vì vậy trước khi làm phép tính phải đổi ra number trước (Dùng các hàm : Val, CDbl . . . )
Thân!
 
Sai chổ nào bạn có thể giúp không ?
 
sonktc đã viết:
Sai chổ nào bạn có thể giúp không ?
Bạn thử nhé!! Chỉ để tham khảo thôi.
PHP:
Option Explicit
Private Sub H_CBCal_Click()
    Call TBChange
End Sub
PHP:
Private Sub H_OBAu_Click()
    Me.H_CBCal.Visible = False
End Sub
PHP:
Private Sub H_OBMa_Click()
    Me.H_CBCal.Visible = True
End Sub
PHP:
Private Sub H_TB01_AfterUpdate()
    If Me.H_OBAu.Value = True Then Call TBChange
End Sub
PHP:
Private Sub H_TB02_AfterUpdate()
    If Me.H_OBAu.Value = True Then Call TBChange
End Sub
PHP:
Private Sub H_TB03_AfterUpdate()
    If Me.H_OBAu.Value = True Then Call TBChange
End Sub
PHP:
Sub TBChange()
    On Error Resume Next
    Dim i1 As Double, i2 As Double, i3 As Double, i4 As Double
    With Me
    
        i1 = CDbl(.H_TB01.Value) * 2
        i2 = CDbl(.H_TB02.Value) * 4
        i3 = CDbl(.H_TB03.Value) * 3
        i4 = (i1 + i2 + i3) / 9
            
        .H_TB01.Value = Format(.H_TB01.Value, "#,##0")
        .H_TB02.Value = Format(.H_TB02.Value, "#,##0")
        .H_TB03.Value = Format(.H_TB03.Value, "#,##0")
        .H_TB04.Value = Format(i4, "#,##0")
    
    End With
    
End Sub
PHP:
Private Sub UserForm_Initialize()
 Me.H_CBCal.Visible = False
 End Sub

Thân!
 

File đính kèm

Chú ý xíu :
  1. Địa chỉ range sai
Cám ơn đã nhắc nhở. Nhưng tôi thử rồi mới dám viết bài. Xem file.

2.Textbox.Value là ký tự, vì vậy trước khi làm phép tính phải đổi ra number trước (Dùng các hàm : Val, CDbl . . . )
Thân!
Có thể trong chương trình lớn sẽ phải lưu ý cái ký tự nhưng trong thí dụ này thì OK.

Thanks,
 

File đính kèm

ngocmaipretty đã viết:
Cám ơn đã nhắc nhở. Nhưng tôi thử rồi mới dám viết bài. Xem file.


Có thể trong chương trình lớn sẽ phải lưu ý cái ký tự nhưng trong thí dụ này thì OK.

Thanks,
  1. Vâng, cách khai báo này vẫn đúng, mặc dù cách khai báo này là không thông dụng. Mình đã nhầm về điều này.
  2. Khi Form hiện lên, các textbox chưa có gì, nhấn nút Calculate thì sẽ bị báo lỗi.
  3. Tương tự, khi lỡ nhập ký tự vào Textbox thì sẽ bị báo lỗi.
Mong xem xét lại
Thân!
 
Do đọc không kỹ câu hỏi nên không giải đáp hết được. Nay đọc kỹ và đã làm lại.
Bạn xem nhé :
PHP:
Sub TBChange()
    On Error Resume Next
    Dim i1 As Double, i2 As Double, i3 As Double, i4 As Double
    With Me
        
        i1 = CDbl(.H_TB01.Value) * CDbl(.H_HS01.Value)
        i2 = CDbl(.H_TB02.Value) * CDbl(.H_HS02.Value)
        i3 = CDbl(.H_TB03.Value) * CDbl(.H_HS03.Value)
        i4 = (i1 + i2 + i3) / 9
            
        .H_TB01.Value = Format(.H_TB01.Value, "#,##0")
        .H_TB02.Value = Format(.H_TB02.Value, "#,##0")
        .H_TB03.Value = Format(.H_TB03.Value, "#,##0")
        .H_TB04.Value = Format(i4, "#,##0")
    
    End With
    
End Sub

Private Sub UserForm_Initialize()
    Me.H_CBCal.Visible = False
    Me.H_HS01.Value = Sheet1.Range("A1")
    Me.H_HS02.Value = Sheet1.Range("B1")
    Me.H_HS03.Value = Sheet1.Range("C1")
End Sub
Thân!
 

File đính kèm

  1. Khi Form hiện lên, các textbox chưa có gì, nhấn nút Calculate thì sẽ bị báo lỗi.
  2. Tương tự, khi lỡ nhập ký tự vào Textbox thì sẽ bị báo lỗi.
Mong xem xét lại

Đúng rồi, thanks Mr OkeBab.
Tôi mới lượm lặt được chút đỉnh, xài thử 1 chút ấy mà.

Nhưng file của OkeBab không báo lỗi nếu chưa có gì trong textbox vì không bị lỗi Divided by zero. Nhưng giả sử các cell A1, B1, C1 có chỉ cần 1 giá trị rỗng hoặc zero thì vẫn lỗi.

Còn khi lỡ nhập kýtự vào thí dụ thay vì 100 mà là q100, dù không báo lỗi nhưng kết quả sai do tính cell đó như là có giá trị 0.

Trừ trường hợp có bẫy lỗi và bắt nhập liệu lại. Cái này tôi có xem trên GPE nhưng chưa thực hiện lần nào.
 
Bạn thân mến!
Cảm ơn bạn nhiều!
ngocmaipretty đã viết:
Nhưng file của OkeBab không báo lỗi nếu chưa có gì trong textbox vì không bị lỗi Divided by zero. Nhưng giả sử các cell A1, B1, C1 có chỉ cần 1 giá trị rỗng hoặc zero thì vẫn lỗi.

Sao lại chia cho 0 nhỉ ??
Mình không hiểu lắm, sao lại lỗi nhỉ ??? Mình kiểm tra kỹ rồi. Bạn có thể nói rõ hơn???

Còn khi lỡ nhập kýtự vào thí dụ thay vì 100 mà là q100, dù không báo lỗi nhưng kết quả sai do tính cell đó như là có giá trị 0.
Dĩ nhiên phải coi nó là 0 rồi, chứ bạn muốn coi nó là bao nhiêu???

Trừ trường hợp có bẫy lỗi và bắt nhập liệu lại. Cái này tôi có xem trên GPE nhưng chưa thực hiện lần nào.
Ngay khi các Textbox_AfterUpdate, sẽ có một hàm kiểm tra tính hợp lệ của chuỗi nhập vào (Hoặc dùng Textbox_KeyPress), nếu OK thì mới chấp nhận

Thân!
 
Thấy rồi Mr bab:
Các textbox nhỏ bên phải lấy dữ liệu từ các cell, nhưng kết quả lại chia cho const 9. Làm sao mà lỗi Div By Zero được. Khâm phục.
nghĩa là cell A1, B1, C1 có giá trị là bao nhiêu cũng chia 9.
Hic hic
Dĩ nhiên phải coi nó là 0 rồi, chứ bạn muốn coi nó là bao nhiêu???
Coi là 0, thì kết quả sai, --> thì tôi muốn bẫy lỗi để nhập liệu lại. Nhưng chưa biết làm.

Hic hic hic!
 
Lần chỉnh sửa cuối:
Coi là 0, thì kết quả sai, --> thì tôi muốn bẫy lỗi để nhập liệu lại. Nhưng chưa biết làm.
Mấy cái vụ bẩy lổi này nếu cảm thấy phức tạp quá thì ta cứ tạo 1 công thức nhỏ tại 1 cell nào đó, giá trị trả về dạng TRUE, FALSE.. rồi lấy giá trị cell này làm điều kiện cho code... Bẩy tùm lum có khi chỉ thêm rối
ANH TUẤN
 
ngocmaipretty đã viết:
Thấy rồi Mr bab:

Coi là 0, thì kết quả sai, --> thì tôi muốn bẫy lỗi để nhập liệu lại. Nhưng chưa biết làm.

Hic hic hic!

Bạn chú ý :
Mr Okebab đã viết:
Ngay khi các Textbox_AfterUpdate, sẽ có một hàm kiểm tra tính hợp lệ của chuỗi nhập vào (Hoặc dùng Textbox_KeyPress), nếu OK thì mới chấp nhận

Nghĩa là có 2 cách:
  1. Nhập xong rồi mới kiển tra tính hợp lệ của chuỗi nhập vào ??? : Textbox_AfterUpdate
  2. Kiểm tra tính hợp lệ ngay từ khi nhấn bàn phím?? : Textbox_KeyPress
Bạn muốn dùng cái nào ???

Thân!
 
ngocmaipretty đã viết:
Các textbox nhỏ bên phải lấy dữ liệu từ các cell, nhưng kết quả lại chia cho const 9. Làm sao mà lỗi Div By Zero được. Khâm phục.
nghĩa là cell A1, B1, C1 có giá trị là bao nhiêu cũng chia 9.
MrOKeBab coi lại chỗ này: Yêu cầu là tính trung bình
tổng(thừa số i X hệ số i ) / tổng hệ số
Nhưng dù hệ số (lấytừ các cell A1:C1) bằng bao nhiêu cũng chia cho 9 là .... hình như sai.
Coi chừng bị thuốc cái chữ "khâm phục".
 
ptm0412 đã viết:
MrOKeBab coi lại chỗ này: Yêu cầu là tính trung bình
tổng(thừa số i X hệ số i ) / tổng hệ số
Nhưng dù hệ số (lấytừ các cell A1:C1) bằng bao nhiêu cũng chia cho 9 là .... hình như sai.
Coi chừng bị thuốc cái chữ "khâm phục".
Cái thay 9 bằng các tổng các hệ số chẳng có gì là lạ cả, em chỉ đưa ra 1 cái VD để các bạn tham khảo chứ không hẳn là giải đáp trọn vẹn đáp án.

PHP:
Sub TBChange()
    On Error Resume Next
    Dim i1 As Double, i2 As Double, i3 As Double, i4 As Double, _
        h1 As Long, h2 As Long, h3 As Long
    With Me
        
        h1 = CDbl(.H_HS01.Value)
        h2 = CDbl(.H_HS02.Value)
        h3 = CDbl(.H_HS03.Value)
        
        i1 = CDbl(.H_TB01.Value) * h1
        i2 = CDbl(.H_TB02.Value) * h2
        i3 = CDbl(.H_TB03.Value) * h3
        i4 = (i1 + i2 + i3) / IIf((h1 + h2 + h3) > 0, (h1 + h2 + h3), 1)
            
        .H_TB01.Value = Format(.H_TB01.Value, "#,##0")
        .H_TB02.Value = Format(.H_TB02.Value, "#,##0")
        .H_TB03.Value = Format(.H_TB03.Value, "#,##0")
        .H_TB04.Value = Format(i4, "#,##0")
    
    End With
    
End Sub


Cảm ơn bác!!

Thân
 
Web KT

Bài viết mới nhất

Back
Top Bottom