Em hỏi công thức cộng (1 người xem)

Liên hệ QC

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

1975hocmai

Thành viên mới
Tham gia
20/12/07
Bài viết
37
Được thích
1
Cần hỏi lệnh cộng dồn

em muốn hỏi cách cộng dồn như sau : ví dụ ở ô a1 là số 4, khi em nhập số 5 thì ra kết quả là 9, nhập tiếp số 1 ra kết quả là 10. Và cứ nhập tiếp số, sẽ ra kết quả tự động. Ai biét chỉ cho em với
 
Đây là một cách. Nhập số vào ô khác ô A1 sẽ được cộng với ô A1 và đưa kết quả vào ô A1.
 

File đính kèm

Vậy thì cũng ko phải là khó quá... Có thể cộng dồn dc khi ta nhập vào chính cell nguồn ko?
Ví dụ A1 = 5, giờ ta nhập số mới vào A1, chẳng hạn là 4... làm sao đễ A1 bây giờ có kết quả là 9
???
ANH TUẤN
 
chibi đã viết:
Đây là một cách. Nhập số vào ô khác ô A1 sẽ được cộng với ô A1 và đưa kết quả vào ô A1.

Dear các Anh,
Nhân tiện về việc cộng dồn anh giúp em một chút, là vì trước em đã hỏi về cái này, nhưng chưa thỏa mãn lắm, vì khi thay đổi row và cột thì nó bị lệch khỏi bảng tính (trc đây có một chị giúp em bằng VBA về việc cộng dồn), em có một Vd đính kèm mong anh xem và giải giúp em. Cái này rất tiện trong việc hàng ngày update năng để biết đc hàng hóa đến khi nào thì sx xong,còn để xuất khẩu cho khách hàng.


Cảm ơn anh
NHT
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn các anh

Các phương pháp trên của các anh cũng rất hay, em xin cảm ơn. Nhưng nếu có cách + liên tiếp trong 1 ô như em đã nêu thì hay hơn rất nhiều và thuận lợi trong công việc.
Anh chị nào biết chỉ tiếp cho em với
 
m có một Vd đính kèm mong anh xem và giải giúp em. Cái này rất tiện trong việc hàng ngày update năng để biết đc hàng hóa đến khi nào thì sx xong,còn để xuất khẩu cho khách hàng.

Thế thì tốt nhất đặt 2 bảng ở 2 sheet (sheet Dl nhập & Sheet cộng dồn) - như thế khi đó vị trí ô đầu tiên của bảng không đổi khi thêm hàng thêm cột, và yêu cầu dữ liệu lấp đầy bảng (ko có DL thì nhập 0). Đồng thời các mặt hàng để theo đúng thứ tự tương ứng của 2 bảng (hay chí ít tương ứng về cột)

Nếu thế thì dùng VBA để viết là được

Và nữa DL là lớn hay nhỏ (hàng trăm / hay nghìn dòng)?
 
Bạn xem vừa í chưa nha!

Nguyễn Hương Thơm đã viết:
Dear các Anh,
Nhân tiện về việc cộng dồn anh giúp em một chút, . . . vì khi thay đổi row và cột thì nó bị lệch khỏi bảng tính. Em có một Vd đính kèm mong anh xem và giải giúp em. Cảm ơn anh NHT
Nếu còn vấn đề gì, sẽ cùng giải tiếp nha!

(Nếu cần sửa dữ liệu vừa nhập thì nhấn nút Edit (hay CTRL+SHIFT+e)
Còn bình thường cứ nhập thì sẽ được cập nhật qua vùng B; khỏi cần nút trong trường hợp này làm chi!!
)(&&@@
 

File đính kèm

Lần chỉnh sửa cuối:
anhtuan1066 đã viết:
Có thể cộng dồn dc khi ta nhập vào chính cell nguồn ko?
Ví dụ A1 = 5, giờ ta nhập số mới vào A1, chẳng hạn là 4... làm sao đễ A1 bây giờ có kết quả là 9???
ANH TUẤN
1975hocmai đã viết:
Nhưng nếu có cách + liên tiếp trong 1 ô như em đã nêu thì hay hơn rất nhiều và thuận lợi trong công việc.

Một ý tưởng rất hay.
 
Chào Hương Thơm!
Về vấn đề cộng dồn thật ra ko phải là chuyện khó.. nhưng gian nan nhất vẫn là khi cấu trúc dử liệu bị thay đỗi.. Nếu là người khá khá 1 chút thì có thể chỉnh sửa code cho phù hợp, nhưng người dùng bình dân thì ko phải ai cũng làm dc.. Đó là chưa nói đến chuyện xem code của người khác thường hay bị hoa mắt... hi... hi...
Anh gữi em code này:
PHP:
Sub Test()
    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 + Cells(iR, iC).Value
        Cells(iR + MovR, iC + MovC).Value = iAdd
    Next i
End Sub
Việc còn lại duy nhất của em bây giờ là:
1> Copy code vào module
2> Đặt name cho mãng nguồn là NGUON, và đích là DICH
Mai này dử liệu của em có sự thay đỗi cấu trúc, hoặc đơn giản là em kéo các mãng đi nơi khác thì code vẫn hoạt động dc bình thường... thậm chỉ đỗi luôn tên sheet cũng ko có vấn đề...
Phần Edit (hay Undo) thì quá dễ, khi chạy code ta copy DICH sang vùng tạm.. lúc bấm nút Edit thì copy vùng tạm paste vào DICH
Xem file đính kèm: vùng màu vàng là NGUON, vùng màu XANH là DICH.. Em có thể quét chọn các vùng và kéo thả đi đâu tùy thích
(Kỹ thuật định vị tương đối này học của anh SA_DQ.. cảm ơn anh!)
ANH TUẤN
 

File đính kèm

Đã có giải pháp cộng dồn trên 1 ô khi nhập đây rùi

Như mong muốn của
1975hocmai đã viết:
em muốn hỏi cách cộng dồn như sau : ví dụ ở ô a1 là số 4, khi em nhập số 5 thì ra kết quả là 9, nhập tiếp số 1 ra kết quả là 10. Và cứ nhập tiếp số, sẽ ra kết quả tự động. Ai biét chỉ cho em với

anhtuan1066 đã viết:
Có thể cộng dồn dc khi ta nhập vào chính cell nguồn ko?
Ví dụ A1 = 5, giờ ta nhập số mới vào A1, chẳng hạn là 4... làm sao đễ A1 bây giờ có kết quả là 9
???
và thêm nữa
chibi đã viết:
Một ý tưởng rất hay.
Đã có giải pháp đây rùi
theo đúng mong muốn: cứ nhập vào A1 lại cộng dồn, cộng dồn tiếp lun vào:
PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 Static oldValue
  If Not Intersect([A1], Target) Is Nothing Then
     Application.EnableEvents = False
     Target.Value = Target.Value + oldValue
     Application.EnableEvents = True
     oldValue = Target.Value
  End If
End Sub
 
Lần chỉnh sửa cuối:
Nhân tiên Tigertiger làm luôn cái vụ Undo của Hương Thơm luôn đi.. Nếu có cách nào đó mà ko cần vùng tạm thì càng ngon ăn... Nhớ vào 1 vùng nhớ tạm nào đó có dc ko nhỉ?
Tôi đã làm xong phần ADD trong bài #9, nhưng còn phần Undo tôi thấy nếu copy sang vùng tạm thì chưa hay lắm nên cũng chưa làm...
ANH TUẤN
 
Nhân tiên Tigertiger làm luôn cái vụ Undo của Hương Thơm luôn đi.. Nếu có cách nào đó mà ko cần vùng tạm thì càng ngon ăn... Nhớ vào 1 vùng nhớ tạm nào đó có dc ko nhỉ?
Tôi đã làm xong phần ADD trong bài #9, nhưng còn phần Undo tôi thấy nếu copy sang vùng tạm thì chưa hay lắm nên cũng chưa làm...
ANH TUẤN

Được chứ, nhưng chắc nói Hương Thơm chuyển sang chủ đề khác đi, cứ lẫn lộn 2 cái thế này, xem mất cả hứng,

Nhờ MOD SMOD ghé qua chuyển các bài liên quan Hương thơm sang topic mới đi

Còn vụ sheet tạm thì atuan có thể cộng sheet tam rồi unhide sheet này là được
.
 
tigertiger đã viết:
Được chứ, nhưng chắc nói Hương Thơm chuyển sang chủ đề khác đi, cứ lẫn lộn 2 cái thế này, xem mất cả hứng,

Nhờ MOD SMOD ghé qua chuyển các bài liên quan Hương thơm sang topic mới đi

Còn vụ sheet tạm thì atuan có thể cộng sheet tam rồi unhide sheet này là được
.
Uh... tôi cũng đang làm như vậy.. nhưng thấy.. ko hay.. Làm sao mà chẳng có 1 vùng tạm nào cả mới hay (xem như là vùng tạm ảo ko tồn tại thực tế)
 
Đã giải quyết vấn đề undo "Nguyễn Hương Thơm"

Đơn giản thôi undo thì ta lấy giá trị của đích - thay vì + là được mà:
Chỉ lưu ý là chỉ undo 1 lần và bất cứ thay đổi nào trong vùng NGUON hay vùng DICH sau khi cộng dồn (Add) thì nút undo sẽ tự mờ (mất hiệu lực và chỉ có hiệu lực khi nút Add Value lại bấm tiếp)

Và toàn ộ code như sau:

ở module1
PHP:
Option Explicit

Sub AddDL(Optional AdUd1 As Integer = 1)

Dim StartRN As Integer, StartCN As Integer, StartRD As Integer, StartCD As Integer
Dim Rw As Integer, Cw As Integer, MovR As Integer, MovC   As Integer, NCell  As Integer
Dim i As Integer, iR As Integer, iC As Integer, iAdd As Double
    
    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 + AdUd1 * Cells(iR, iC).Value
        Cells(iR + MovR, iC + MovC).Value = iAdd
    Next i
End Sub


trong trang code của sheet1 (với CmAdd - nút cộng DL, CmUN - nút undo; xem file gửi kèm)

PHP:
Option Explicit
Private Sub CmAdd_Click()
  Call AddDL
  CmUN.Enabled = True
End Sub

Private Sub CmUN_Click()
    Call AddDL(-1)
    CmUN.Enabled = False
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If (Not Intersect(Range("Nguon"), Target) Is Nothing) Or _
       (Not Intersect(Range("Dich"), Target) Is Nothing) Then _
       CmUN.Enabled = False
End Sub

Chúc thành công - xem file gửi kèm cho hiểu rõ,
 

File đính kèm

Nguyên văn bởi 1975hocmai
Nhưng nếu có cách + liên tiếp trong 1 ô như em đã nêu thì hay hơn rất nhiều và thuận lợi trong công việc.
Bạn xem file thử đúng với yêu cầu chưa. Có gì ta bàn tiếp
 

File đính kèm

Hay nhỉ? Sao chẳng thấy chổ nào thêm bớt công trừ gì cả? Thế sao nó lại Undo dc?
Có 1 chổ tôi đoán chắc là "nó" : Call AddDL(-1)
Mà ko hiểu -1 nghĩa là cái gì?
Tigertiger có thể giãi thích thêm 1 ko?
ANH TUẤN
 
Vấn đề là chỗ này:

iAdd = Cells(iR + MovR, iC + MovC).Value + AdUd1 * Cells(iR, iC).Value

nếu AdUd ko có giá trị nó lấy là 1; còn khi gọi undo thì ta cho nó là AddDL(-1) -> nhân với -1 thì nó lấy kq của đích -nguồn

như vậy k cần dùng dùng sheet tạm nào cả

hic hiiiii
 
Lần chỉnh sửa cuối:
Vẫn chưa nắm bắt dc thuật toán ??? Hic.. sao ta? Hơi bị cao siêu rồi... Có những thứ nếu hiểu tự dưng sẽ hiểu mà ko thể giãi thích tại sao! Giống như OFFSET tôi thấy rất dễ hiểu mà khi giãi thích cho người khác lại vô cùng khó khăn, ko làm sao cho người ta hiểu dc
Dù sao cũng cảm ơn Tigertiger.. đễ tôi từ từ ngâm cứu đã
Nói thật tôi làm xong phần định vị tương đối đã là cố gắng rất lớn rồi... Hoa cả mắt, giờ mà bảo làm lại chưa chắc đã dc... Hic... Món này vì có sự tương quan với công thức Excel như Column(), Row() nên tôi còn hình dung dc mà chuyễn đỗi thành code... Còn cái (-1) của Tigertiger phải hình dung như thế nào đây nhỉ?
ANH TUẤN
 
Lần chỉnh sửa cuối:
tại post#15
Voda đã viết:
Bạn xem file thử đúng với yêu cầu chưa. Có gì ta bàn tiếp

Oh, voda sử dụng 1 vùng tạm để lưu rồi,

bạn xem post#10 đã giải quyết vấn đề này rui, không sd vùng tạm, hic
 
Nguyên văn bởi tigertiger
Oh, voda sử dụng 1 vùng tạm để lưu rồi,
bạn xem post#10 đã giải quyết vấn đề này rui, không sd vùng tạm, hic
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?
 
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
 
Vấn đề này mình nghĩ làm được theo cách của tigertiger:
-Mỗi lần ADD là mỗi lần ghi các giá trị nguồn vào 1 biến mãng.
-Lúc UNDO, ta gọi lại các giá trị này.
-Cách này có thể cho phép UNDO vô số lần.
 
voda đã viết:
Vấn đề này mình nghĩ làm được theo cách của tigertiger:
-Mỗi lần ADD là mỗi lần ghi các giá trị nguồn vào 1 biến mãng.
-Lúc UNDO, ta gọi lại các giá trị này.
-Cách này có thể cho phép UNDO vô số lần.
Ác cái là chưa hiểu thuật toán này nên cũng bằng ko... Mà tính em thì ko thích áp dụng cái gì mình chưa biết... Như thế khó chịu lắm mỗi khi muốn tùy biến nó theo ý mình... thà ko xài còn hơn!
ANH TUẤN
 
Vấn đề này mình nghĩ làm được theo cách của tigertiger
-Mỗi lần ADD là mỗi lần ghi các giá trị nguồn vào 1 biến mãng.
-Lúc UNDO, ta gọi lại các giá trị này.
-Cách này có thể cho phép UNDO vô số lần.
Cái này mình nghĩ không phải là vấn đề thuật toán, mà là do khai báo biến:
1. Khai báo biến mảng
2. Khai báo biến 1 cách hoặc 1 dạng nào đó mà giá trị được lưu trữ chứ không bi xóa sau mỗi lần thực thi.
Không biết nghĩ vậy có đúng không nữa.
 
Cái này mình nghĩ không phải là vấn đề thuật toán, mà là do khai báo biến:
1. Khai báo biến mảng
2. Khai báo biến 1 cách hoặc 1 dạng nào đó mà giá trị được lưu trữ chứ không bi xóa sau mỗi lần thực thi.
Không biết nghĩ vậy có đúng không nữa. __________________

Đúng rồi,
Đó là khai báo Public,
và lưu ý nữa là khi mới mở file (sự kiện open) thì lấy giá trị từ các ô gán vào biến, thế thôi
 

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

Back
Top Bottom