Hỗ trợ phép toàn trừ giữ nguyên định dạng

Liên hệ QC

Tình nghĩa giang hồ

Thanh sơn bất cải, lục thủy trường lưu
Tham gia
29/9/20
Bài viết
330
Được thích
429
Chào anh chị.
Do dữ liệu em lấy từ phần mềm ra. Nên số âm nó quy định dấu - ở bên phải.
Giờ em muốn thực hiện phép trừ cho phép tính này. Nhưng em mong muốn kết quả ra thì dấu trừ vẫn ở bên phải, để so sánh với phần mềm.
Cột thực hiện phép trừ của em là cột H - cho cột I.
Em cảm ơn anh chị.
 

File đính kèm

Chào anh chị bài này em giải chống chế bằng công thức
Cột J2 =IF(RIGHT(H2,1)="-",(SUBSTITUTE(H2,"-","")-SUBSTITUTE(I2,"-",""))&"-",H2-I2)

Hoặc VBA

Sub phep_tru()
lr = Sheet1.Range("H" & Rows.Count).End(xlUp).Row
Sheet1.Range("J2").Formula = "=IF(RIGHT(RC[-2],1)=""-"",(SUBSTITUTE(RC[-2],""-"","""")-SUBSTITUTE(RC[-1],""-"",""""))&""-"",RC[-2]-RC[-1])"

Sheet1.Range("J2").Select
Selection.AutoFill Destination:=Range("J2:J" & lr), Type:=xlFillDefault
Sheet1.Range("J2:J" & lr) = Sheet1.Range("J2:J" & lr).Value
End Sub

Nhưng cách này em thấy không ổn lắm,
Nếu viết bằng mảng mà không dùng công thức thì làm như thế nào anh chị.
Nhờ anh chị hỗ trợ giúp.
Em cảm ơn
 
Chào anh chị.
Do dữ liệu em lấy từ phần mềm ra. Nên số âm nó quy định dấu - ở bên phải.
Giờ em muốn thực hiện phép trừ cho phép tính này. Nhưng em mong muốn kết quả ra thì dấu trừ vẫn ở bên phải, để so sánh với phần mềm.
Cột thực hiện phép trừ của em là cột H - cho cột I.
Em cảm ơn anh chị.
Thử công thức tại J2 (Nếu máy phân cách hàng ngàn không phải là dấu "," thì dài hơn xíu):
Mã:
=TEXT(SUMPRODUCT(TEXT(--(RIGHT(H2:I2)="-"),"[=0]\1;-1")*SUBSTITUTE(H2:I2,"-","")*{1,-1}),"#,#;#,#-")
 
Chào anh chị bài này em giải chống chế bằng công thức
Cột J2 =IF(RIGHT(H2,1)="-",(SUBSTITUTE(H2,"-","")-SUBSTITUTE(I2,"-",""))&"-",H2-I2)

Hoặc VBA

Sub phep_tru()
lr = Sheet1.Range("H" & Rows.Count).End(xlUp).Row
Sheet1.Range("J2").Formula = "=IF(RIGHT(RC[-2],1)=""-"",(SUBSTITUTE(RC[-2],""-"","""")-SUBSTITUTE(RC[-1],""-"",""""))&""-"",RC[-2]-RC[-1])"

Sheet1.Range("J2").Select
Selection.AutoFill Destination:=Range("J2:J" & lr), Type:=xlFillDefault
Sheet1.Range("J2:J" & lr) = Sheet1.Range("J2:J" & lr).Value
End Sub

Nhưng cách này em thấy không ổn lắm,
Nếu viết bằng mảng mà không dùng công thức thì làm như thế nào anh chị.
Nhờ anh chị hỗ trợ giúp.
Em cảm ơn
Mình góp vui bằng code thế này (đúng phương trâm 1+1 =2) nhá.
Bạn thử kiểm tra lại xem nhé!
PHP:
Option Explicit
Sub GPE()
    Dim Lr&, i&, Arr(), Res(), a&, b&, k&
    With Sheets("Sheet1")
        Lr = .Range("H" & Rows.Count).End(xlUp).Row
        Arr = .Range("H2:I" & Lr).Value
        ReDim Res(1 To UBound(Arr), 1 To 1)
        For i = 1 To UBound(Arr)
            k = k + 1
            a = InStr(Arr(i, 1), "-")
            b = InStr(Arr(i, 2), "-")
            If a = 0 And b = 0 Then
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = Arr(i, 1) - Arr(i, 2)
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
            End If
            ElseIf a = 0 And b > 0 Then
            Arr(i, 2) = Left(Arr(i, 2), b - 1) * 1
                    Res(k, 1) = Arr(i, 1) + Arr(i, 2)
            ElseIf a > 0 And b > 0 Then
                Arr(i, 1) = Left(Arr(i, 1), a - 1) * 1
                Arr(i, 2) = Left(Arr(i, 2), b - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = Arr(i, 2) - Arr(i, 1)
                End If
            ElseIf a > 0 And b = 0 Then
                Arr(i, 1) = Left(Arr(i, 1), a - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                End If
            End If
        Next i
        If k Then
            .Range("J2:J10000").ClearContents
            .Range("J2").Resize(k, 1).Value = Res
        End If
    End With
    MsgBox "Xong roi"
End Sub
 
Lần chỉnh sửa cuối:
Mình góp vui bằng code thế này (đúng phương trâm 1+1 =2) nhá.
Bạn thử kiểm tra lại xem nhé!
PHP:
Option Explicit
Sub GPE()
    Dim Lr&, i&, Arr(), Res(), a&, b&, k&
    With Sheets("Sheet1")
        Lr = .Range("H" & Rows.Count).End(xlUp).Row
        Arr = .Range("H2:I" & Lr).Value
        ReDim Res(1 To UBound(Arr), 1 To 1)
        For i = 1 To UBound(Arr)
            k = k + 1
            a = InStr(Arr(i, 1), "-")
            b = InStr(Arr(i, 2), "-")
            If a = 0 And b = 0 Then
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = Arr(i, 1) - Arr(i, 2)
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
            End If
            ElseIf a = 0 And b > 0 Then
                Arr(i, 2) = Left(Arr(i, 2), b - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = Arr(i, 1) - Arr(i, 2)
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
            End If
            ElseIf a > 0 And b > 0 Then
                Arr(i, 1) = Left(Arr(i, 1), a - 1) * 1
                Arr(i, 2) = Left(Arr(i, 2), b - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                End If
            ElseIf a > 0 And b = 0 Then
                Arr(i, 1) = Left(Arr(i, 1), a - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                End If
            End If
        Next i
        If k Then
            .Range("J2:J10000").ClearContents
            .Range("J2").Resize(k, 1).Value = Res
        End If
    End With
    MsgBox "Xong roi"
End Sub
Cảm ơn bạn nhiều nhiều.
 
Mình góp vui bằng code thế này (đúng phương trâm 1+1 =2) nhá.
Bạn thử kiểm tra lại xem nhé!
PHP:
Option Explicit
Option Explicit
Sub GPE()
    Dim Lr&, i&, Arr(), Res(), a&, b&, k&
    With Sheets("Sheet1")
        Lr = .Range("H" & Rows.Count).End(xlUp).Row
        Arr = .Range("H2:I" & Lr).Value
        ReDim Res(1 To UBound(Arr), 1 To 1)
        For i = 1 To UBound(Arr)
            k = k + 1
            a = InStr(Arr(i, 1), "-")
            b = InStr(Arr(i, 2), "-")
            If a = 0 And b = 0 Then
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = Arr(i, 1) - Arr(i, 2)
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
            End If
            ElseIf a = 0 And b > 0 Then
            Arr(i, 2) = Left(Arr(i, 2), b - 1) * 1
                    Res(k, 1) = Arr(i, 1) + Arr(i, 2)
            ElseIf a > 0 And b > 0 Then
                Arr(i, 1) = Left(Arr(i, 1), a - 1) * 1
                Arr(i, 2) = Left(Arr(i, 2), b - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                End If
            ElseIf a > 0 And b = 0 Then
                Arr(i, 1) = Left(Arr(i, 1), a - 1) * 1
                If Arr(i, 1) >= Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                ElseIf Arr(i, 1) < Arr(i, 2) Then
                    Res(k, 1) = (Arr(i, 1) - Arr(i, 2)) & "-"
                End If
            End If
        Next i
        If k Then
            .Range("J2:J10000").ClearContents
            .Range("J2").Resize(k, 1).Value = Res
        End If
    End With
    MsgBox "Xong roi"
End Sub
Chưa có đọc nhưng mà sao dài ghê vậy bạn hihi
 
Thêm cách khác tham khảo
Mã:
Sub ABC()
    Dim sArr(), Res(), i&, CotH As Double, CotI As Double
    With Sheets("Sheet1")
        sArr = .Range("H2:I15").Value
        ReDim Res(1 To UBound(sArr), 1 To 1)
        For i = 1 To UBound(sArr)
           CotH = iif(InStr(sArr(i, 1), "-"), "-" & Replace(sArr(i, 1), "-", ""), sArr(i, 1))
           CotI = iif(InStr(sArr(i, 2), "-"), "-" & Replace(sArr(i, 2), "-", ""), sArr(i, 2))
           Res(i, 1) = CotH - CotI
           If Res(i, 1) < 0 Then Res(i, 1) = Abs(Res(i, 1)) & "-"
        Next
        .Range("J2").Resize(UBound(sArr)).Value = Res
    End With
End Sub
 
Mệt.
Nhiều phần mềm theo định dạng cũ của Kế toán là dấu trừ nằm bên phải (nếu số dương thì là một dấu cách.)
Dùng Text-to-columns hay flash fill là xong.
 
Web KT

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

Back
Top Bottom