Em hỏi công thức cộng

Liên hệ QC
Tôi chưa hiểu lắm về thuật toán mà Tigertiger trình bày, tuy nhiên tôi cũng lờ mờ hiểu rằng sẽ làm 1 động tác gì đó đễ đổi dấu (+), (-) cho hệ số nhân... Thế là tôi theo hướng này và làm 1 bài test như sau:
PHP:
Sub Add()
   Range("A1").Value = ActiveWorkbook.Names("Temp").Value
   HS = Range("A1").Value
   Range("C1").Value = Range("C1").Value + HS * Range("B1").Value
   ActiveWorkbook.Names("Temp").Value = 1
End Sub
Private Sub Cmd_Add_Click()
   Call Add
   Sheet1.Cmd_Undo.Enabled = True
End Sub
Private Sub Cmd_Undo_Click()
   ActiveWorkbook.Names("Temp").Value = -1
   Call Add
   Sheet1.Cmd_Undo.Enabled = False
End Sub
Trong này "Temp" chính là 1 name do tôi tự đặt, khởi tạo =1... Các bạn hãy xem kỹ, tôi phải gắn Range("A1") = Temp rồi từ đó mới đưa vào code... Tại sao lại ko đưa HS trực tiếp vào code luôn dc nhỉ? Chẳng hạn là:
PHP:
Sub Add()
   HS= ActiveWorkbook.Names("Temp").Value
   Range("C1").Value = Range("C1").Value + HS * Range("B1").Value
   ActiveWorkbook.Names("Temp").Value = 1
End Sub
Nếu làm như trên thì bị báo lỗi.. Tôi chẳng hiểu tại sao nữa...
Các bạn xem file và góp ý giùm với
ANH TUẤN
 

File đính kèm

May mắn có bạn Lam_AQ nhắc nhở, khai báo Public nên tôi đã làm dc rồi... Tuy ko hay bằng của Tigertiger, nhưng là tự tôi làm nên cảm thấy khoái... Ha... ha..
Là thế này đây:
PHP:
Public Add As Integer
Private Sub Cmd_Add_Click()
    Add = 1
    Call AddValue
    Sheet1.Cmd_Undo.Enabled = True
End Sub
Private Sub Cmd_Undo_Click()
    Add = -1
    Call AddValue
    Sheet1.Cmd_Undo.Enabled = False
End Sub
Sub AddValue()
    StartRN = Range("Nguon").Row
    StartCN = Range("Nguon").Column
    StartRD = Range("Dich").Row
    StartCD = Range("Dich").Column
    Rw = Range("Nguon").Rows.Count
    Cw = Range("Nguon").Columns.Count
    NCELL = Range("Nguon").Cells.Count
    MovR = StartRD - StartRN
    MovC = StartCD - StartCN
    For i = 1 To NCELL
        iR = ((i - 1) \ Cw) + StartRN
        iC = (i Mod Cw) + StartCN
        iAdd = Cells(iR + MovR, iC + MovC).Value + Add * Cells(iR, iC).Value
        Cells(iR + MovR, iC + MovC).Value = iAdd
    Next i
    Add = 1
    Sheet1.Cmd_Undo.Enabled = True
End Sub
Tạm tạm là thế (chưa khai báo biến)
Cảm ơn anh SA_DQ về phần định vị giữa các mãng
Cảm ơn Tigertiger về hướng thêm bớt cộng trừ nhân chia
Cảm ơn Lam_AQ về bài học Public
ANH TUẤN
 

File đính kèm

voda đã viết:
Cám ơn tigertiger nhé. Mình bàn một chút nghe. Theo mình, không thể không sử dụng vùng tạm được. Vì khai báo static chỉ lưu biến trong thời gian mở file. Khi ta đóng file, số liệu cộng dồn trước đó biến mất. Bạn có cách gì để khắc phục vấn đề này không?
cám ơn voda, có câu hỏi hay
Oh, mình cũng đã nghĩ tới, và có giải pháp đây ,
đó sử dụng sự kiện và code trong this workbook như sau (khi mở file thì load giá trị cho old value - nếu có)


PHP:
Option Explicit
 Public oldValue
Private Sub Workbook_Open()
    If Cells(1, 1).Value <> "" Then oldValue = Cells(1, 1).Value
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Not Intersect([Sheet1!A1], Target) Is Nothing Then
     Application.EnableEvents = False
     Target.Value = Target.Value + oldValue
     Application.EnableEvents = True
     oldValue = Target.Value
  End If
End Sub

Alt+F11 -> chọn ThisWorkbook (ở lề trái) -> rồi dán code trên vào là OK
 
Lần chỉnh sửa cuối:
Vấn đề mà thấy Voda và bạn Tigertiger trao đỗi tôi chưa hiểu lắm.. nhưng cho hỏi nó có ảnh hưỡng gì trong phần giãi quyết yêu cầu của Hương Thơm ko? Nghe mọi người nói tôi chứ sợ sẽ bị mất dử liệu gì gì đó... Nhưng kiểm tra đi, kiểm tra lại.. lưu file rồi mở ra thấy vẫn bình thường mà...
Thầy Voda và bạn Tigertiger cho biết ý kiến với (lo quá)
ANH TUẤN
 
anhtuan1066 đã viết:
Vấn đề mà thấy Voda và bạn Tigertiger trao đỗi tôi chưa hiểu lắm.. nhưng cho hỏi nó có ảnh hưỡng gì trong phần giãi quyết yêu cầu của Hương Thơm ko? Nghe mọi người nói tôi chứ sợ sẽ bị mất dử liệu gì gì đó... Nhưng kiểm tra đi, kiểm tra lại.. lưu file rồi mở ra thấy vẫn bình thường mà...
Thầy Voda và bạn Tigertiger cho biết ý kiến với (lo quá)
ANH TUẤN
Oh, khác nhau Voda đang bàn về nhập cộng dồn cho ô - bằng cách nhập tay liên tiếp, không liên quan đến vấn đề của Hương Thơm
Đúng là 1 chủ đề mà lại 2 topic - khó xử quá
 
Nguyên văn bởi tigertiger
Oh, mình cũng đã nghĩ tới, và có giải pháp đây ,
đó sử dụng sự kiện và code trong this workbook như sau (khi mở file thì load giá trị cho old value - nếu có)
Giải pháp hay và sáng tạo. Bạn lưu giá trị cũ của ô vào biến ngay khi mở file, rồi dùng biến đó để tính toán. Để chương trình khả thi, bạn có thể phát triển thêm điều này được không: Ta không chỉ nhập vào 1 ô mà nhập dữ liệu vào 1 vùng. Giải pháp trên còn hiệu quả hay không?
 
voda đã viết:
Để chương trình khả thi, bạn có thể phát triển thêm điều này được không: Ta không chỉ nhập vào 1 ô mà nhập dữ liệu vào 1 vùng. Giải pháp trên còn hiệu quả hay không?

thì lúc này voda biến oldvalue thành biến mảng là được mà, thử khám phá xem sao
 
Mình cũng nghĩ là dùng biến mảng. Cách này hay là không cần vùng tạm nhưng hơi cực. Phải dùng vòng lặp để ghi dữ liệu vào biến mảng rồi đọc lại nó để tính toán. Cám ơn tigertiger
 
Cảm ơn các bạn

Mình xin cảm ơn các bạn đã tham gia chủ đề này. Càng tìm hiểu VBA càng thấy hay.
Cho mình hỏi tí nữa nha. Mình đã nhập code và đã làm được phép tính + dồn trong 1 ô rồi. Mình đã vào objects để sửa và chọn ô cần + dồn, sửa B4 thành B... gì tuỳ ý. Ví dụ: tại ô B4 mình đã làm phép tính + dồn được rồi, giờ mình muốn ô C4 và D4 cũng + dồn được thì phải làm như nào??
Đừng cười mình nha.
 
Mình làm được ở nhiều ô rồi

Các bạn ơi, kết quả + dồn không được chính xác lắm.
Ví dụ : tại ô A1: Mình +1=1; +2 = 3; + 3 = 6; + 3 = 12. Như vậy kết quả không đúng. Phép + cuối lẽ ra phải = 9 nhưng lại cho ra kết quả 12.
Ai biết chỉ dùm mình cách sửa với
 
Sửa hộ với

Phép + dồn ở 2 ô liên tiếp . Ví dụ :
- Tại ô A1 là 2800
- Ô B1 là 1312.
Khi + thêm 1 vào ô B1 thì cho ra kết quả là 2801
Giải thích và sửa dùm mình với.
 
1975hocmai đã viết:
Các bạn ơi, kết quả + dồn không được chính xác lắm.
Ví dụ : tại ô A1: Mình +1=1; +2 = 3; + 3 = 6; + 3 = 12. Như vậy kết quả không đúng. Phép + cuối lẽ ra phải = 9 nhưng lại cho ra kết quả 12.
Ai biết chỉ dùm mình cách sửa với
tôi thử lại rùi, vẫn chính xác
Bạn lấy code ở bài post#23 cho chuẩn nhé
.
 
1975hocmai đã viết:
Phép + dồn ở 2 ô liên tiếp . Ví dụ :
- Tại ô A1 là 2800
- Ô B1 là 1312.
Khi + thêm 1 vào ô B1 thì cho ra kết quả là 2801
Giải thích và sửa dùm mình với.

Với giải pháp, tigertiger đã post ở chủ đề

http://www.giaiphapexcel.com/forum/showthread.php?t=7050


Giờ bạn có thể cho cả A1,B1 vào vùng nhập cộng dồn và khi đó muốn như trên, thì bạn chọn cả 2 ô A1:B1 rồi nhập 1 và bấm Ctrl+Enter -> khi đó cả 2 ô cùng cộng lên 1.
 
Tôi nghĩ lại vấn đề cộng dồn trong file của Hương Thơm, tại sao ko dùng chức năng sẳn có của Excel mà record macro nhỉ?... chẳng hạn thế này:
PHP:
Sub CongDon()
    Range("NGUON").Copy
    Range("DICH").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
    Application.CutCopyMode = False
End Sub
Có phải là đở rắc rối ko nhỉ? Vẫn có dc khã năng kéo mãng nguồn hoặc đích đi bất cứ nơi đâu mà ko hề bị sai
ANH TUẤN
 
Lần chỉnh sửa cuối:
Và trên quan điểm đó tôi làm file này gữi cho bạn Hương Thơm... Tin chắc giãi pháp cuối cùng này thật sự ngắn gọn và dễ hiểu đối với nhưng ai mới bước chân vào lĩnh vực VBA
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Range("NGUON"), Target) Is Nothing Then
          Sheet1.Cmd_Undo.Enabled = False
     End If
End Sub
Private Sub Cmd_Add_Click()
    Call Add
    Sheet1.Cmd_Undo.Enabled = True
End Sub
Private Sub Cmd_Undo_Click()
    Call Undo
    Sheet1.Cmd_Undo.Enabled = False
End Sub
Sub Add()
    Range("NGUON").Copy
    Range("DICH").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
    Application.CutCopyMode = False
End Sub
Sub Undo()
    Range("NGUON").Copy
    Range("DICH").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlSubtract
    Application.CutCopyMode = False
End Sub
ANH TUÂN
 

File đính kèm

Cải tiến thêm 1 tí nữa thì 2 mãng NGUON và DICH có thể mang đi bất cứ sheet nào tùy ý (miễn sao name của nó vẫn còn là NGUON va DICH).. Mặc khác ActiveSheet là sheet nào cũng ko còn quan trong nữa
PHP:
Sub Add()
    Application.Goto Reference:="NGUON"
    Selection.Copy
    Application.Goto Reference:="DICH"
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
    Application.CutCopyMode = False
End Sub
Sub Undo()
    Application.Goto Reference:="NGUON"
    Selection.Copy
    Application.Goto Reference:="DICH"
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlSubtract
    Application.CutCopyMode = False
End Sub
Mặc sức chuyễn dời vô tư...
ANH TUẤN
 
Code ngắn gọn, hiệu quả. Đề nghị bỏ dòng:
Sheet1.Cmd_Undo.Enabled = False
để có thể phát huy chức năng UNDO nhiều lần.
 
Ko dc UNDO nhiều lần đâu thầy ơi... nguy hiểm lắm... vì chỉ mỗi lần ADD là mỗi lần dử liệu khác nhau... biết đâu trời đất nào mà UNDO
Thầy có ý kiến gì hay hơn ko cho trường hợp này?
ANH TUẤN
 
Đính chính: Mình bị nhầm. Chức năng này chỉ UNDO theo giá trị nhập cuối cùng. Thế nên không thể UNDO đúng nghĩa được. Cám ơn anhtuan1066 nhé!
 
Giá như mỗi lần ADD là mỗi lần nhớ dc giá trị cũa NGUON nhỉ? Chỉ cần có thể nhở dc 3 lần cuối cùng liên tiếp là ngon lành luôn...
Tôi vẫn có cãm giác là sẽ làm dc điều này nhưng sao nghĩ hoài ko ra (tất nhiên là vẫn theo phương án giãi quyết bài toán mà ko cần vùng phụ thực nào cả)
Hic...
ANH TUẤN
 
Web KT

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

Back
Top Bottom