XD360 KÍNH CHÚC CHO MỌI NHÀ VẠN SỰ AN LÀNH!

Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng

 Quên mật khẩu
 Đăng ký mới
Anh Trần HòeBùi Quốc Hưng
Xem: 5739|Trả lời: 12
In Chủ đề trước Tiếp theo
Thu gọn cột thông tin

[Hỏi] Kiểm tra giá trị nhập vào có phải là số nguyên

[Lấy địa chỉ]

Hãy đăng nhập để có nhiều chức năng hữu dụng hơn và xem ảnh rõ hơn!

Bạn phải đăng nhập để xem được nội dung, nếu bạn chưa có tài khoản? hãy Đăng ký mới

x
Mình có đoạn code sau dùng để nội suy chi phí lập BCKTKT theo định mức 79 của Bộ Xây dựng:Trong đoạn code này, biến Loai_cong_trinh là cơ sở để gán giá trị của mảng 2.
Mình muốn kiểm tra giá trị nhập vào của Loai_cong_trinh, nếu không phải là số nguyên từ 1-5 thì hiện ra thông báo hướng dẫn để nhập cho đúng.
Tuy nhiên, khi mình nhập vào số nguyên <1 hoặc >6 thì hiện ra thông báo, nhưng nhập số thập phân (vd: 1.1; 5.6...) thì vẫn chạy bình thường thay vì phải hiện ra thông báo, rát mong được sự giúp đỡ!
Xin cảm ơn!

[Visual Basic] 纯文本查看 复制代码
Public Function BCKTKT(Gia_tri As Double, Loai_cong_trinh As Integer) As Double
    Dim i As Integer
    Dim delta As Double
    Dim Mang1(1 To 4) As Double
    Dim Mang2(1 To 4) As Double
    Mang1(1) = 1: Mang1(2) = 3: Mang1(3) = 7: Mang1(4) = 15:
    If Loai_cong_trinh = 1 Then
        Mang2(1) = 6.5: Mang2(2) = 4.7: Mang2(3) = 4.2: Mang2(4) = 3.6:
    ElseIf Loai_cong_trinh = 2 Then
        Mang2(1) = 6.7: Mang2(2) = 4.8: Mang2(3) = 4.3: Mang2(4) = 3.8:
    ElseIf Loai_cong_trinh = 3 Then
        Mang2(1) = 5.4: Mang2(2) = 3.6: Mang2(3) = 2.7: Mang2(4) = 2.5:
    ElseIf Loai_cong_trinh = 4 Then
        Mang2(1) = 6.2: Mang2(2) = 4.4: Mang2(3) = 3.9: Mang2(4) = 3.6:
    ElseIf Loai_cong_trinh = 5 Then
        Mang2(1) = 5.8: Mang2(2) = 4.2: Mang2(3) = 3.4: Mang2(4) = 3:
    Else
        BCKTKT = 0
        MsgBox "Loai cong trinh chua phu hop!" & vbCrLf & vbCrLf _
             & "Ban vui long chon Loai_cong_trinh nhu sau:" & vbCrLf _
             & "1 = Cong trinh Dan dung" & vbCrLf _
             & "2 = Cong trinh Cong nghiep" & vbCrLf _
             & "3 = Cong trinh Giao thong" & vbCrLf _
             & "4 = Cong trinh Nong nghiep phat trien nong thon" & vbCrLf _
             & "5 = Cong trinh Ha tang ky that"
             Exit Function
    End If
    If Gia_tri <= Mang1(1) Then
        BCKTKT = Mang2(1)
    Else
        i = 0
        Do
            i = i + 1
        Loop Until (Mang1(i) >= Gia_tri)
        delta = (Mang2(i) - Mang2(i - 1)) / (Mang1(i) - Mang1(i - 1))
        BCKTKT = delta * (Gia_tri - Mang1(i - 1)) + Mang2(i - 1)
    End If
End Function



Đánh giá

"Loại công trình" người dùng sẽ nhập vào đâu? Vào trong sheet hay vào form VBA?  Đăng lúc 8/3/2017 11:02

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

2#
tranhoe Đăng lúc 8/3/2017 09:47 | Chỉ xem của tác giả
Dùng if lồng nhau nhiều quá dể rối và chạy chậm, nên sử dụng Select Case
Em xem thử hàm sau:
[Visual Basic] 纯文本查看 复制代码
Function KiemTra(GiaTri As Range) As Boolean
    Select Case GiaTri
    Case 1
        KiemTra = True
    Case 2
        KiemTra = True
    Case 3
        KiemTra = True
    Case 4
        KiemTra = True
    Case 5
        KiemTra = True
    Case Else
        KiemTra = False
    End Select
End Function


Số người tham gia 2Thưởng +5 Thanked +2 Thu lại Lý do
longriver28284 + 1 Cảm ơn quan tâm của bạn nhiều!
fubi + 5 + 1 Bài hay. Cảm ơn!

Xem tất cả

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

3#
 Tác giả| longriver28284 Đăng lúc 8/3/2017 10:51 | Chỉ xem của tác giả

Em đã sửa lại nhưng không giải quyết được ạ?
[Visual Basic] 纯文本查看 复制代码
Public Function BCKTKT(Gia_tri As Double, Loai_cong_trinh As Integer) As Double
    Dim i As Integer
    Dim delta As Double
    Dim Mang1(1 To 4) As Double
    Dim Mang2(1 To 4) As Double
    Mang1(1) = 1: Mang1(2) = 3: Mang1(3) = 7: Mang1(4) = 15:
    Select Case Loai_cong_trinh
    Case 1
        Mang2(1) = 6.5: Mang2(2) = 4.7: Mang2(3) = 4.2: Mang2(4) = 3.6
    Case 2
        Mang2(1) = 6.7: Mang2(2) = 4.8: Mang2(3) = 4.3: Mang2(4) = 3.8
    Case 3
        Mang2(1) = 5.4: Mang2(2) = 3.6: Mang2(3) = 2.7: Mang2(4) = 2.5
    Case 4
        Mang2(1) = 6.2: Mang2(2) = 4.4: Mang2(3) = 3.9: Mang2(4) = 3.6
    Case 5
        Mang2(1) = 5.8: Mang2(2) = 4.2: Mang2(3) = 3.4: Mang2(4) = 3
    Case Else
        BCKTKT = 0
        MsgBox "Loai cong trinh chua phu hop!" & vbCrLf & vbCrLf _
             & "Ban vui long chon Loai_cong_trinh nhu sau:" & vbCrLf _
             & "1 = Cong trinh Dan dung" & vbCrLf _
             & "2 = Cong trinh Cong nghiep" & vbCrLf _
             & "3 = Cong trinh Giao thong" & vbCrLf _
             & "4 = Cong trinh Nong nghiep phat trien nong thon" & vbCrLf _
             & "5 = Cong trinh Ha tang ky that"
        Exit Function
    End Select
    If Gia_tri <= Mang1(1) Then
        BCKTKT = Mang2(1)
    Else
        i = 0
        Do
            i = i + 1
        Loop Until (Mang1(i) >= Gia_tri)
        delta = (Mang2(i) - Mang2(i - 1)) / (Mang1(i) - Mang1(i - 1))
        BCKTKT = delta * (Gia_tri - Mang1(i - 1)) + Mang2(i - 1)
    End If
End Function



Đánh giá

Bạn dùng code của anh TranHoe ấy.  Đăng lúc 8/3/2017 10:59

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

4#
 Tác giả| longriver28284 Đăng lúc 8/3/2017 13:46 | Chỉ xem của tác giả
longriver28284 gửi lúc 8/3/2017 10:51
Em đã sửa lại nhưng không giải quyết được ạ?[mw_shl_code=vb,true]Public Function BCKTKT( ...

Em chưa hiểu lắm ạ

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

5#
tranhoe Đăng lúc 8/3/2017 14:55 | Chỉ xem của tác giả

Fubi đã comment" "Loại công trình" người dùng sẽ nhập vào đâu? Vào trong sheet hay vào form VBA? mà em không hiểu.
Đoạn nhập loại công trình để ngoài sheet (dùng Validate cho khỏe).
Anh lập lại bảng tính như thế này:
Noi suy chi phi lap BC KTKT.xls (24 KB, Lượt tải về: 682)

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

6#
 Tác giả| longriver28284 Đăng lúc 8/3/2017 15:48 | Chỉ xem của tác giả
tranhoe gửi lúc 8/3/2017 14:55
Fubi đã comment" "Loại công trình" người dùng sẽ nhập vào đâu? Vào trong sheet hay v ...

Em thường xuyên nhận nhiều file dự toán do tư vấn lập, và hay kiểm tra trên file đó luôn  cho nhanh, mà file đó thì không có sẵn chỗ để chọn loại công trình như file của anh làm.
Vì vậy, loại công trình em sẽ nhập trực tiếp vào hàm luôn(quy ước từ 1-5 cho từng loại công trình) cho chủ động (vì nó nằm trong code), khi cần kiểm tra kết quả ở file của tư vấn ta chỉ cần copy code vào module của file hoặc tạo thành add-in cho excel cài sẵn  trên máy sẽ tiện hơn.
Đoạn code của em đã giải quyết cơ bản vấn đề nếu nhập Loaicongtrinh là các  giá trị 1; 2...5; các giá trị <1 và >5.
Nhưng nếu nhập loaicongtrinh giá trị là số thập phân trong khoảng 1-5, ví dụ 1,2; 4,6... thì nó vẫn chạy thay vì hiện thông báo nhập từ 1-5 ứng với loại công trình.
Rất mong các anh tiếp tục giúp đỡ.

Đánh giá

Code bên dưới được chưa?  Đăng lúc 10/3/2017 09:37
Do bạn chưa biết cách áp dụng cụ thể thôi.  Đăng lúc 8/3/2017 16:14
mọi người sẽ hướng dẫn cách giải quyết ngắn gọn dễ dàng hơn cho bạn. Vì cách Anh TranHoe là rất hay đấy.  Đăng lúc 8/3/2017 16:14
Vậy cách giải quyết của bạn không hay đâu. Bạn nên chia sẻ đề bài yêu cầu cụ thể lên đây, có ví dụ file càng tốt  Đăng lúc 8/3/2017 16:13

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

7#
tranhoe Đăng lúc 9/3/2017 05:45 | Chỉ xem của tác giả
longriver28284 gửi lúc 8/3/2017 15:48
Em thường xuyên nhận nhiều file dự toán do tư vấn lập, và hay kiểm tra trên file đó  ...

Vậy thì dùng code sau:
[Visual Basic] 纯文本查看 复制代码
Public Function BCKTKT(Gia_tri As Double, Loai_cong_trinh As Double) As Double
    Dim i As Integer
    Dim delta As Double
    Dim Mang1(1 To 4) As Double
    Dim Mang2(1 To 4) As Double
    If Int(Loai_cong_trinh) <> Loai_cong_trinh Then GoTo Thoat
    Mang1(1) = 1: Mang1(2) = 3: Mang1(3) = 7: Mang1(4) = 15
    Select Case Loai_cong_trinh
    Case 1
        Mang2(1) = 6.5: Mang2(2) = 4.7: Mang2(3) = 4.2: Mang2(4) = 3.6
    Case 2
        Mang2(1) = 6.7: Mang2(2) = 4.8: Mang2(3) = 4.3: Mang2(4) = 3.8
    Case 3
        Mang2(1) = 5.4: Mang2(2) = 3.6: Mang2(3) = 2.7: Mang2(4) = 2.5
    Case 4
        Mang2(1) = 6.2: Mang2(2) = 4.4: Mang2(3) = 3.9: Mang2(4) = 3.6
    Case 5
        Mang2(1) = 5.8: Mang2(2) = 4.2: Mang2(3) = 3.4: Mang2(4) = 3
    Case Else
        GoTo Thoat
    End Select
    If Gia_tri <= Mang1(1) Then
        BCKTKT = Mang2(1)
    Else
        i = 0
        Do
            i = i + 1
        Loop Until (Mang1(i) >= Gia_tri)
        delta = (Mang2(i) - Mang2(i - 1)) / (Mang1(i) - Mang1(i - 1))
        BCKTKT = Round(delta * (Gia_tri - Mang1(i - 1)) + Mang2(i - 1), 3)
    End If
    Exit Function
Thoat:
    BCKTKT = 0
    MsgBox "Loai cong trinh chua phu hop!" & vbCrLf & vbCrLf _
         & "Ban vui long chon Loai_cong_trinh nhu sau:" & vbCrLf _
         & "1 = Cong trinh Dan dung" & vbCrLf _
         & "2 = Cong trinh Cong nghiep" & vbCrLf _
         & "3 = Cong trinh Giao thong" & vbCrLf _
         & "4 = Cong trinh Nong nghiep phat trien nong thon" & vbCrLf _
         & "5 = Cong trinh Ha tang ky thuat"
End Function


Số người tham gia 1Thưởng +5 Thanked +1 Thu lại Lý do
fubi + 5 + 1 Rất chuyên nghiệp! Thanks!

Xem tất cả

www.xaydung360.vn XÂY TÂM, DỰNG TẦM CHUYÊN NGHIỆP

Phiên bản Mobile|Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng  

Phần mềm dự toán xây dựng excel | Hướng dẫn lập dự toán xây dựng | Phần mềm tư vấn giám sát | Phần mềm quản lý chất lượng xây dựng |

Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng

Phần mềm ôn thi sát hạch chứng chỉ hành nghề Kiến Trúc sư

Phần mềm ôn thi sát hạch chứng chỉ hành nghề Đấu thầu

GMT+7, 16/6/2025 22:00 , Processed in 0.156156 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Kiso Comsenz Inc.