Tự động chuyển dữ liệu giữa 2 sheet!

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

salomi

Thành viên mới
Tham gia
15/9/07
Bài viết
3
Được thích
0
Em có Sheet 1 là sheet bao gồm tất cả dữ liệu. Có nghĩa là Sheet 1 có dữ liệu A, B, C, D, E, F .... Em muốn khi em nhập dữ liệu bất kể ví dụ như : A vào Sheet 2, thì Sheet1 sẽ tự động mất dữ liệu A. Hay ngược lại, khi em del
dữ liệu A bên Sheet 1 thì dữ liệu A sẽ tự động nhảy qua Sheet 2
Làm ơn giúp em với!
 
salomi đã viết:
Em có Sheet 1 là sheet bao gồm tất cả dữ liệu. Có nghĩa là Sheet 1 có dữ liệu A, B, C, D, E, F .... Em muốn khi em nhập dữ liệu bất kể ví dụ như : A vào Sheet 2, thì Sheet1 sẽ tự động mất dữ liệu A. Hay ngược lại, khi em del
dữ liệu A bên Sheet 1 thì dữ liệu A sẽ tự động nhảy qua Sheet 2
Làm ơn giúp em với!

Không hiểu lắm, bạn cần nói rõ hơn và có file VD càng tốt.
Thân!
 
Upvote 0
Tôi hiểu mà ko biết cách làm... nhưng tôi nghĩ có lẽ phải dùng VBA đấy!
Có nghĩa là thế này đây: 1 giá trị nào đó chỉ có thể nằm duy nhất trong 1 sheet, hoặc nằm ở sheet 1, hoặc nằm ở sheet 2... Khi nhập vào 1 giá trị nào đó vào sheet 1 mà giá trị này đã tồn tại trong sheet 2 thì bên sheet 2 sẽ tự động dc xóa đi đễ bảo đãm tính duy nhất... Và ngược lại, xóa 1 giá trị nào đó trong sheet 1 thì tự động add lại giá trị ấy vào sheet 2
Bắp thử nghiên cứu xem... Giống Flip-flop quá nhỉ
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Tôi hiểu mà ko biết cách làm... nhưng tôi nghĩ có lẽ phải dùng VBA đấy!
Có nghĩa là thế này đây: 1 giá trị nào đó chỉ có thể nằm duy nhất trong 1 sheet, hoặc nằm ở sheet 1, hoặc nằm ở sheet 2... Khi nhập vào 1 giá trị nào đó vào sheet 1 mà giá trị này đã tồn tại trong sheet 2 thì bên sheet 2 sẽ tự động dc xóa đi đễ bảo đãm tính duy nhất... Và ngược lại, xóa 1 giá trị nào đó trong sheet 1 thì tự động add lại giá trị ấy vào sheet 2
Bắp thử nghiên cứu xem... Giống Flip-flop quá nhỉ
ANH TUẤN

Em thì nghĩ là dùng Countif thôi (Dĩ nhiên là VBA rồi)
  1. Nếu nhập vào thì dễ : Sử dụng sự kiện Worksheet_Change với giá trị của ActiveCell
  2. Xóa đi khó hơn :Nó cũng xác định xem giá trị ô vừa xóa đã có chưa. Nếu có rồi thì bỏ qua, nếu chưa có thì nhập ngay gí trị đó vào địa chỉ tương đương ở sheet kia. Tuy nhiên giá trị vừa xóa lấy sao đây ?? Ta lại phải sử dụng sự kiện Worksheet_Selection để lấy giá trị của ô được chọn.
Giải pháp là thế, tuy nhiên em cần đề cập đến gốc rễ của vấn đề là vấn đề đó (File của bạn ấy) có phải là chỉ có giải pháp đó không hay ta có thể đi con đường khác ???

Thân!
 
Upvote 0
Tính từ dễ đến khó đi nha: Đầu tiên là 2 sheet trống chưa có gì... Nếu nhập vào sheet1 một giá trị nào đó thì bắt đâu ghi nhớ...Khi qua sheet 2 nhập liệu thì bắt đầu kiểm tra sự tồn tại và tính duy nhất của giá trị ấy bên sheet 1... Chính vì thế mà khi ta xóa 1 giá trị bên sheet 2 thì ko thể có chuyện giá trị ấy ĐANG TỒN TẠI bên sheet 1 dc, đúng ko? (vì đã dc kiễm tra từ đầu rồi)... Mọi chuyện cứ thế mà diển tiến
Bắp nghĩ thử xem!
 
Upvote 0
Ah... phát hiện Bắp vừa lên dc 2 ngôi sao vàng rồi nhé.. Xin chúc mừng
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Tính từ dễ đến khó đi nha: Đầu tiên là 2 sheet trống chưa có gì... Nếu nhập vào sheet1 một giá trị nào đó thì bắt đâu ghi nhớ...Khi qua sheet 2 nhập liệu thì bắt đầu kiểm tra sự tồn tại và tính duy nhất của giá trị ấy bên sheet 1... Chính vì thế mà khi ta xóa 1 giá trị bên sheet 2 thì ko thể có chuyện giá trị ấy ĐANG TỒN TẠI bên sheet 1 dc, đúng ko? (vì đã dc kiễm tra từ đầu rồi)... Mọi chuyện cứ thế mà diển tiến
Bắp nghĩ thử xem!

Cũng có lý, tuy nhiên đấy là em đề phòng TH người ta nhập lụi (không enable macro) nên trước mỗi khi xóa nó sẽ kiểm tra. (Dân Kế toán tài chính tình cẩn thận mà bác)

Còn nếu không có thì dễ rồi, bác thừa sức làm mà.

Thân!
 
Upvote 0
anhtuan1066 đã viết:
Tôi hiểu mà ko biết cách làm... nhưng tôi nghĩ có lẽ phải dùng VBA đấy!
Có nghĩa là thế này đây: 1 giá trị nào đó chỉ có thể nằm duy nhất trong 1 sheet, hoặc nằm ở sheet 1, hoặc nằm ở sheet 2... Khi nhập vào 1 giá trị nào đó vào sheet 1 mà giá trị này đã tồn tại trong sheet 2 thì bên sheet 2 sẽ tự động dc xóa đi đễ bảo đãm tính duy nhất... Và ngược lại, xóa 1 giá trị nào đó trong sheet 1 thì tự động add lại giá trị ấy vào sheet 2
Bắp thử nghiên cứu xem... Giống Flip-flop quá nhỉ
ANH TUẤN



Vấn đề này đúng như bạn nói, nhưng mình không rành về lập trình lắm, bạn có thể hướng dẫn cụ thể cho mình không? Cảm ơn bạn trước!
 
Upvote 0
Thật ra ở cty tôi cũng đang gặp phải 1 vấn đề tương tự.. Tôi trình bày cho các bạn tiện theo dõi nhé!
Giả sử cty có 100 máy, chia ra cho 5 phân xưởng (mỗi xưỡng trung bình 20 máy, có thể xê xích chút đĩnh)
Tôi có 1 sheet chứa toàn bộ danh sách máy này và 5 sheet của 5 xưởng, mỗi xưỡng ghi danh sách máy trong xưởng đó
Vậy sẽ có lúc máy từ xưỡng này chuyển sang xưởng kia... Vì thế tôi cũng muốn giống bạn Salomi, nghĩa là khi tôi nhập vào 1 xưởng nào đó tên máy vừa dc chuyển tới thì chương trình sẽ tự động xem và xóa đi tên máy ấy trong những sheet khác đễ bảo đãm tính duy nhất..
Tôi cũng có nghĩ qua là dùng Validation chống nhập trùng, nhưng ko ổn... Vì máy móc có thể chuyễn đi ko theo quy luật gì cả... Nhưng phải làm sao bảo đảm tính duy nhất... nghĩa là 1 máy ko thể tồn tại ở 2 nơi
Tôi tạo 1 dử liệu thô, nhờ các bạn giúp giùm nhé!
Mến
ANH TUẤN
 

File đính kèm

Upvote 0
Mr Okebab đã viết:
Em thì nghĩ là dùng Countif thôi (Dĩ nhiên là VBA rồi)
  1. Nếu nhập vào thì dễ : Sử dụng sự kiện Worksheet_Change với giá trị của ActiveCell
  2. Xóa đi khó hơn :Nó cũng xác định xem giá trị ô vừa xóa đã có chưa. Nếu có rồi thì bỏ qua, nếu chưa có thì nhập ngay gí trị đó vào địa chỉ tương đương ở sheet kia. Tuy nhiên giá trị vừa xóa lấy sao đây ?? Ta lại phải sử dụng sự kiện Worksheet_Selection để lấy giá trị của ô được chọn.
Giải pháp là thế, tuy nhiên em cần đề cập đến gốc rễ của vấn đề là vấn đề đó (File của bạn ấy) có phải là chỉ có giải pháp đó không hay ta có thể đi con đường khác ???

Thân!


Bạn có thể hướng dãn cụ thể hơn cho mình ko? Thú thật là mình không rành VB lắm! Vần đề này đúng như bạn AnhTuan đã nói đó! Làm ơn giúp mình nhé! Cảm ơn bạn!
 
Upvote 0
A Recycle_Bin Sheet

Mình thì hiểu ý salomi là cái sheet sau xem như cái Recycle bin của windows vậy. Bạn xem thử nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Rất cám ơn soibien, tôi đang lùng bùng ở chỗ, nên tạo mới DM rồi xóa hay là nếu kiểm tra rồi tạo mới. Bạn đã cho tôi giải pháp.
Nếu tiện bạn làm thêm, trước khi nhập copy mã sang 1 range mới và từ đó xóa dần, ie danh mục vẫn bảo tòan.
 
Upvote 0
Cái này rất dễ: Tôi Lấy ví dụ xưởng của anhtuan1066 để diễn giải. rất đơn giản thôi các bạn: chúng ta sử dụng Worksheet_Change: khi bạn nhập dữ liệu cho 1 Sheet bất kỳ thì range trong ô đó <> rỗng. khi đó ta tạo một function kiểm tra xem các sheet khác có ô nào mang giá trị = với giá trị của ô mình nhập không nếu bằng thì xóa, ngược lại khi bạn xóa dữ liệu thì ngượi lại range trong Worksheet_Change bằng rỗng. Nếu bạn nào không rõ liên hệ trực tiếp qua email inconarco@vnn.vn tôi sẽ gửi file làm đc việc đó
 
Upvote 0
ThuNghi đã viết:
Rất cám ơn soibien, tôi đang lùng bùng ở chỗ, nên tạo mới DM rồi xóa hay là nếu kiểm tra rồi tạo mới. Bạn đã cho tôi giải pháp.
Nếu tiện bạn làm thêm, trước khi nhập copy mã sang 1 range mới và từ đó xóa dần, ie danh mục vẫn bảo tòan.
Chào Thunghi.
thú thực là mình không làm trong ngành kế toán, nên chưa hiểu rõ yêu cầu gì? có phải là giống với yêu cầu của AnhTuan không? tức là có một sheet DM, và sheet đó không hề thay đổi? nếu vậy nó lại khác với yêu cầu đầu tien của Salomi. Bạn cứ nêu rõ nhé, mình làm được thì làm ngay thôi.
 
Upvote 0
File của bạn quá hay, đang nghiên cứu mà chưa hiểu lắm. (Không dám nói là không hiểu)
tức là có một sheet DM, và sheet đó không hề thay đổi?
Đúng là như vậy, sh DM cho phép cập nhật. (nếu có)
Khi nhập liệu thì y như vậy (như file bạn đã làm).
Sub Doitbyhand()
Application.EnableEvents = Not Application.EnableEvents
End Sub

Sub LoadData(Row As Long)

For i = 1 To FieldNum
dataarray(i) = Cells(Row, i)
'MsgBox dataarray(i)
Next

End Sub

Sub WriteDataback(TargetSheet As String, Optional changecode As Boolean)
If Not changecode Then
selectlastemptyrow (TargetSheet)
Else
Sheets(TargetSheet).Select
End If
For i = 1 To FieldNum
ActiveCell.Offset(0, i - 1).Value = dataarray(i)
Next
End Sub

Sub selectlastemptyrow(TargetSheet As String)
Sheets(TargetSheet).Select
Cells(65536, 1).Select
Selection.End(xlUp).Offset(1, 0).Select
End Sub

Sub DeleteRecord(TargetSheet As String, Row As Long, Optional besure As Boolean)

Sheets(TargetSheet).Select
If Not besure Then
Range(Cells(Row, 1), Cells(Row, FieldNum)).Delete shift:=xlUp
ElseIf IsEmpty(Cells(Row, 1)) Then Range(Cells(Row, 1), Cells(Row, FieldNum)).Delete shift:=xlUp
End If
End Sub


Sub getData(TargetSheet As String, codeValue As Variant)
Dim i As Integer
If Not IsEmpty(codeValue) Then
Sheets(TargetSheet).Select
Cells(1, 1).Select

Cells.Find(What:=codeValue, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate

For i = 1 To FieldNum
dataarray(i) = Cells(ActiveCell.Row, i)
Next
Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, FieldNum)).Delete shift:=xlUp
End If
End Sub
Nếu có thể bạn giải thích hộ = tiếng Việt
Thuật tóan "dataarray(i) = Cells(Row, i)" rất hay mà chưa hiểu.
Xin cám ơn bạn rất nhiều!
 
Upvote 0
ThuNghi đã viết:
Đúng là như vậy, sh DM cho phép cập nhật. (nếu có)
Khi nhập liệu thì y như vậy (như file bạn đã làm).
thì sheet Data vẫn nhập được mà, còn nếu làm theo kiểu AnhTuan chắc mở một Thread mới :)

ThuNghi đã viết:
Nếu có thể bạn giải thích hộ = tiếng Việt
Thuật tóan "dataarray(i) = Cells(Row, i)" rất hay mà chưa hiểu.
Xin cám ơn bạn rất nhiều!

Cells(Row,Col) trả về value của ô ở dỏng Row, cột Col
datarray(i) : tham chiếu đến biến mảng dataarray thứ i

vậy đọan trên nghĩa là : lấy giá trị ở ô (Row, i) gán vào biến mảng thứ i.

thân.

Mình sẽ làm thêm một file theo kiểu AnhTuan.

PS. dataarray(5) đã khai báo là biến mảng public trong module1

trong khi làm lại, mình nhận thấy file đã up load trước đó có 3 lỗi nhỏ, thành thật xin lỗi các bạn. dưới đây là file mình đã fix lại.
@Admin : nếu được thì admin vui lòng thay cả file mình đã upload trước đó, tránh gây phiền toái cho những ai download nó sau này, Cám ơn Admin nhiều.

View attachment 4015
 
Lần chỉnh sửa cuối:
Upvote 0
Mình làm thử. Chưa được tốt lắm. Các bạn xem rồi cho ý kiến.
 

File đính kèm

Upvote 0
Bạn voda ơi... tôi vừa check mail Yahoo và nhận dc thư của bạn...
Cái topic này mấy hôm nay ko đễ ý, thì ra bạn đã làm 1 file.. Ai cha.. mang về check thử thấy OK quá chừng chừng luôn.. Rất đúng với yêu cầu mà tôi nêu ra... cám ơn nhiều...
Lý ra tôi đã viết mail đễ cám ơn bạn nhưng ko hiểu sao hôm nay vào mail gữi hoài ko dc...
Ah, còn nữa... d/c mail atmt17@yahoo.com tôi chủ yếu dùng đễ đăng ký trên các diển đàn chứ ít khi sử dụng lắm (vì thế mà ko biết bạn đã gữi thư).. Có gì bạn gữi vào mail đang sử dụng của tôi nha: yeulachet1066@yahoo.com
Một lân nữa chân thành cảm ơn... Tuyệt lắm!
ANH TUẤN
 
Upvote 0
Mình nhắn tin nhưng hộp thư của bạn bị quá tải. Nên gởi mail theo chỉ dẫn trên diễn đàn. Mong những ý kiến "nhiều nhiều" của bạn.
 
Upvote 0
voda đã viết:
Mình nhắn tin nhưng hộp thư của bạn bị quá tải. Nên gởi mail theo chỉ dẫn trên diễn đàn. Mong những ý kiến "nhiều nhiều" của bạn.
Hôm qua tôi mới phát hiện hộp thư bị đầy... xóa bớt rồi...
File bạn hay lắm.. Tôi có thêm 1 yêu cầu nhỏ:
1>Bên sheet DATA là danh sách máy nhưng có thể ko cố định, làm cách nào mổi khi nhập vào 1 máy mới thì nó tự động add entry vào DATA (gọi là cập nhât máy mới)...
2>Và còn nữa, tôi nhìn code mà ko biết dùng nhập liệu ở chổ nào? Vì tôi nhập cell nào nó cũng dò tìm cả.. Tôi chỉ cần giới hạn giùm trong 1 cột thôi.. Nghĩa là chỉ khi nhập vào cột A thì mới có tác dụng (bạn có thể đưa vào code A1:A100 chẳng hạn) ..vùng này giống nhau trên mọi sheet và có thể chỉnh lại dc..
Bạn cứ nghĩ đi: tiêu đề mỗi sheet đều giống nhau (chẳng hạn như: DANH SÁCH MÁY, NGÀY, XƯỞNG...) và như vậy khi vào sheet mới, vừa nhập tiêu đề vào thì nó sẽ xóa tiêu đề của sheet khác.. Bạn hiểu ko?
Cám ơn bạn trước
 
Upvote 0
Web KT

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

Back
Top Bottom