Update dữ liệu

Liên hệ QC

trantuonganh2008

Thành viên thường trực
Tham gia
8/11/08
Bài viết
305
Được thích
53
Chào cả nhà! Mình gửi file lên các bạn giúp mình v/d này nhé, cảm ơn nhiều!!!
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn dùng macro sự kiện này thay cho phần chính trong Sheet2

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B2:B99")) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range
   
   Set Sh = Sheets("Sheet3"):          Set Rng = Sh.Range(Sh.[a4], Sh.[A65500].End(xlUp))
5   Rng.NumberFormat = "m/d/yyyy"
6   Set sRng = Rng.Find(Format(Target.Offset(, -1).Value, "M/D/yyyy"), , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      MsgBox "Chua Co Ngay Nay Trong Danh Sach", , "GPE.COM"
   Else
      sRng.Offset(, 1).Value = Target.Value
   End If
   Rng.NumberFormat = "[$-409]d-mmm;@"
 End If
End Sub
Nói thêm cho rõ:
(+) Vùng tác động của macro từ B2:B99 & ô bên trái ô tác động phải có giá trị ngày
Nếu muốn vùng này mở rọng hay thu hẹp ta cần sửa lại tương ứng tại dòng lệnh đầu tiên của macro.
:-=
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cám ơn bạn nhiều!!! Nhưng vì tại sheet3 ở cột ngày tháng mình cài công thức chứ không phải nhập bằng tay nên khi nhập dữ liệu ở sheet2 nó báo lỗi "Chưa có ngày này trong danh sách". Cho mình hỏi có cách nào khắc phục mà không cần hủy bỏ công thức ở cột ngày tháng không??
 
Lần chỉnh sửa cuối:
Mình đề xuất các phương án giải quyết như sau:

(1) Nếu có thể, (ta dùng câu lệnh macro) chuyển hết về dạng Values;

(2) Thêm cột phụ phía trước nó, Chép các số liệu ngày qua đó & tiếp tục như đã có;

(3) . . . . . (Tìm cách chinh phục loại dữ liệu chứa trong công thức dạng ngày)

(4) . . . . . .

Theo bạn chúng ta nên đi theo hướng nào? :-=

Chờ ý của bạn
 
Hi HYEN, Mình nghĩ cách 1 nếu không ảnh hưởng đến việc chỉnh sửa công thức bên ngoài trang excel thì đó là cách tối ưu. Còn cách 3 thì mình nghĩ rất hay, bạn có thể làm dùm mình luôn 2 cách này để có dịp học hỏi thêm nhé! Cám ơn bạn nhiều!!!
 
Lần chỉnh sửa cuối:
Rất vui vì phát hiện ra 1 thú vị!!!

Phương án (1)
Chỉ cần thêm 1 dòng lệnh
Mã:
 [B]Rng.Value = Rng.Value[/B]
lên trước dòng lệnh 5 (Mình vừa đánh số bên trên)


Phương án (3)
Chỉ cần sửa dòng lệnh 6 thành
Mã:
Set sRng = Rng.Find(Format(Target.Offset(, -1).Value, "M/D/yyyy"), , [B]xlValues[/B], xlWhole)
(Đố các bạn mình phát hiện ra điều gì đó!)
 
Cám ơn bạn nhiều!!! Nhờ bạn giúp mình thêm v/d này nữa. Bây giờ mình muốn nhập dữ liệu tiếp tục ở cột B (sheet2), chẳng hạn ở B6 nhưng vẫn là ngày 5 Jan, sau đó dữ liệu này sẽ cập nhật sang sheet3 ở cột C cũng của ngày 5 Jan thì phải sửa lại code như thế nào. Cứ như vậy sang cột D, E, F... Chờ tin bạn, cám ơn nhiều!!! Thân.
 
Lần chỉnh sửa cuối:
Cám ơn bạn nhiều!!! Nhờ bạn giúp mình thêm v/d này nữa. Bây giờ mình muốn nhập dữ liệu tiếp tục ở cột B (sheet2), chẳng hạn ở B6 nhưng vẫn là ngày 5 Jan, sau đó dữ liệu này sẽ cập nhật sang sheet3 ở cột C cũng của ngày 5 Jan thì phải sửa lại code như thế nào. Cứ như vậy sang cột D, E, F... Chờ tin bạn, cám ơn nhiều!!!
|A|B|
|. .|. . |
5|5-Jan|M1
6||M2
7||M3
8||M4
9|. .|. .
(Yêu cầu quan trọng là Các ô dưới A5 phải để trống (cho đến khi muốn nhập ngày khác kế tiếp)
Bạn hãy đối chiếu sự khác nhau giữa hai nội dung macro đi nha!

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B2:B99")) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range
   Dim nRw As Long
   
   Set Sh = Sheets("Sheet3"):          Set Rng = Sh.Range(Sh.[a4], Sh.[A65500].End(xlUp))
   Rng.NumberFormat = "m/d/yyyy"
   With Target.Offset(, -1)
      If .Value <> "" Then
         nRw = 1
      Else
         nRw = Range(.Offset(), .End(xlUp)).Rows.Count
      End If
   End With
   Set sRng = Rng.Find(Format(Target.Offset(1 - nRw, -1).Value, "M/D/yyyy"), _
           , xlValues, xlWhole)
   If sRng Is Nothing Then
      MsgBox "Chua Co Ngay Nay Trong Danh Sach", , "GPE.COM"
   Else
      sRng.Offset(, nRw).Value = Target.Value
   End If
   Rng.NumberFormat = "[$-409]d-mmm;@"
 End If
End Sub
 
Vẫn còn lỗi "chưa có ngày này trong danh sách" khi mình áp dụng code mới của bạn HYEN ơi. Hơn nữa, ý mình muốn là khi nhập vào cột B dữ liệu bất ở đâu chứ không phải là áp nó theo thứ tự theo hàng dọc rồi upload dữ liệu theo hàng ngang qua sheet3. Chẳng hạn: - Khi đã có ngày ở cột A, nhập dữ liệu vào cột B, thì dữ liệu có được ở sheet3 (có ngày tương ứng) có thể là cột B hoặc C hoặc D... có nghĩa là mình muốn nó vào cột nào thì nó vào cột đó. Nhập thêm dữ liệu ở sheet2 tiếp theo thì dữ liệu cũng vào theo ý muốn của mình. Hình như là dùng If và ElseIf mới được. Bạn cố gắng sửa code giúp mình lại nhé. Cám ơn bạn nhiều!!! Thân.
 
Lần chỉnh sửa cuối:
. . . Hơn nữa, ý mình muốn là khi nhập vào cột B dữ liệu bất ở đâu chứ không phải là áp nó theo thứ tự theo hàng dọc rồi upload dữ liệu theo hàng ngang qua sheet3.
Chẳng hạn:
- Khi đã có ngày ở cột A, nhập dữ liệu vào cột B, thì dữ liệu có được ở sheet3 (có ngày tương ứng) có thể là cột B hoặc C hoặc D... có nghĩa là mình muốn nó vào cột nào thì nó vào cột đó. Nhập thêm dữ liệu ở sheet2 tiếp theo thì dữ liệu cũng vào theo ý muốn của mình. Hình như là dùng If và ElseIf mới được. Bạn cố gắng sửa code giúp mình lại nhé. Cám ơn bạn nhiều!!!
Thân.

Vậy bạn phải phát biểu cái ý muốn của bạn lên chứ.
Vì chưa phát biểu í muốn, nên mình cho nó cập nhất theo tuần tự thôi;
Rất chờ để biết ý muốn của bạn đó! :-= --=0 :-=
 
Thì ý mình là như vậy đó, bạn chỉnh sửa code lại dùm mình nhé! Cám ơn bạn hiền nhiều nhe!!! Thân.
 
Lần chỉnh sửa cuối:
Khi đã có ngày ở cột A, nhập dữ liệu vào cột B, thì dữ liệu có được ở sheet3 (có ngày tương ứng) có thể là cột B hoặc C hoặc D... có nghĩa là mình muốn nó vào cột nào thì nó vào cột đó

Thì ý mình là như vậy đó, bạn chỉnh sửa code lại dùm mình nhé! Cám ơn bạn hiền nhiều nhe!!!
Thân.

Bạn phải cho biết rằng loại dữ liệu nào thì được chép vô cột C còn loại nào được chép vô cột D chứ!
Bạn biểu sửa macro , nhưng không cho biết phương cách để sửa thì nghĩa làm sao?. . .

Tôi thí dụ:
Nếu nhập vô dạng chuỗi, thì chép vô cột 'E';
Nều dữ liệu kiểu số <= 10 thì chép vô cột 'B'; >=1.000 thì chép vô cột C, . . .

Có vậy mới sửa Code được chứ.

Bạn hãy suy nghĩ xem, mình đã viết gì & mọi người viết gì chứ!
 
Dữ liệu chỉ là số thông thường thôi. bạn chỉ cần giúp mình cách viết tiêu biểu thôi, còn khi nhập thêm dữ liệu nữa thì mình có thể phân ra được. Cách viết code là khi nhập dữ liệu ở cột B bên sheet2 (bất kỳ vị trí nào ở cột B) update sang sheet3 bất kỳ cột nào có ngày tương ứng là được thôi. Cám ơn bạn đã quan tâm giúp đỡ!!!
 
Lần chỉnh sửa cuối:
Thích tùy hứng thì đặng tùy hứng!

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B2:B99")) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range
   Dim nRw As Long
 
   Set Sh = Sheets("Sheet3"):          Set Rng = Sh.Range(Sh.[a4], Sh.[A65500].End(xlUp))
   Rng.NumberFormat = "m/d/yyyy"
   With Target.Offset(, -1)
      If .Value <> "" And IsDate(.Value) Then
         Set sRng = .Offset()
      Else
         Set sRng = .End(xlUp)
      End If
   End With
   Set sRng = Rng.Find(Format(sRng.Value, "M/D/yyyy"), , xlValues, xlWhole)
   If sRng Is Nothing Then
      MsgBox "Chua Co Ngay Nay Trong Danh Sach", , "GPE.COM"
   Else
17      Randomize:              nRw = 1 + Int(9 * Rnd())
      If sRng.Offset(, nRw).Value = "" Then
         sRng.Offset(, nRw).Value = Target.Value
      Else
         On Error GoTo 0
         Cells(sRng.Row, 255).End(xlToLeft).Offset(, 1).Value = Target.Value
      End If
   End If
   Rng.NumberFormat = "[$-409]d-mmm;@"
 End If
End Sub
:-=
 
Chỉnh sửa lần cuối bởi điều hành viên:
Không được rồi HYEN ơi, mình nhập vào nó nhảy lung tung. Lần cuối cùng mình nói như thế này nhé: Bạn sửa lại code cũ của bạn sao cho: Khi nhập dữ liệu ở cột B trong sheet 2 thì update sang sheet 3 cột B có ngày tương ứng. Nhập dữ liệu tiếp theo ở cột B trong sheet 2 cách dữ liệu trước 8 dòng thì update sang cột kế tiếp trong sheet 3 (cột kế tiếp trong VD này là cột C). Nhập tiếp dữ liệu nữa cũng cách dữ liệu nhập lần thứ hai 8 dòng và update sang cột D của sheet 3. Cứ như vậy nhé, cám ơn HYEN nhiều lắm!!! Thân.
 
Lần chỉnh sửa cuối:
Nhập dữ liệu tiếp theo ở cột B trong sheet 2 cách dữ liệu trước 8 dòng

Mình chờ câu nói này của bạn 02 (bằng chữ: không hai) ngày nay rồi đó;

Bạn đến #8 & vô hiệu hóa dòng lệnh mình vừa đánh số (Bằng cách thêm dấu nháy vô đầu & cuối dòng lệnh)

Chạy thử macro xem, nếu chưa vừa í chổ nào thí phát biểu tiếp;

Điều kiện: Bên cột 'A' không có số liệu giữa các dòng từ lần nhập đầu cho đến lần nhập cuối.

:-= --=0 --=0 :-=
 
Mình không thấy & cũng không biết dòng nào để vô hiệu hóa HYEN à, bạn giúp mình nhé! Ở trên bạn nói "Bên cột 'A' không có số liệu giữa các dòng từ lần nhập đầu cho đến lần nhập cuối" là sao? Cột A là cột "ngày" mà, bạn nhầm là cột B chăng? Rất mong và cảm ơn sự giúp đỡ nhiệt tình của bạn!!!!!!! Thân.
 
Lần chỉnh sửa cuối:
Bạn dùng macro nảy thay cho cái trước đó.

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B2:B99")) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range, Dat As Range
   Dim nRw As Long
   
   Set Sh = Sheets("Sheet3"):          Set Rng = Sh.Range(Sh.[a4], Sh.[A65500].End(xlUp))
   Rng.NumberFormat = "m/d/yyyy"
   With Target.Offset(, -1)
      If .Value <> "" And IsDate(.Value) Then
         Set Dat = .Offset()
      Else
         Set Dat = .End(xlUp)
      End If
   End With
   Set sRng = Rng.Find(Format(Dat.Value, "M/D/yyyy"), , xlValues, xlWhole)
   If sRng Is Nothing Then
      MsgBox "Chua Co Ngay Nay Trong Danh Sach", , "GPE.COM"
   Else
      If sRng.Offset(, 1).Value = "" Then
         sRng.Offset(, 1).Value = Target.Value
      Else
         Sh.Cells(sRng.Row, 255).End(xlToLeft).Offset(, 1).Value = Target.Value
      End If
   End If
   Rng.NumberFormat = "[$-409]d-mmm;@"
 End If
End Sub
 
Cho mình nói rõ hơn nữa nhé. Do mình không đưa file lên vì sợ rối rắm phức tạp, những gì mình hỏi bạn là mình tự nghĩ ra sau đó mình mới áp dụng trên file công việc của mình, mong bạn thông cảm và hiểu cho. Chứ nếu mình đưa file áp dụng của mình lên thì rất khó khăn cho bạn. Mình xin nói tiếp phần trên. Vì sheet 3 của mình chỉ trống từ cột B tới cột I thôi, các cột bên phải từ cột I trở đi đều có dữ liệu. Ý mình là khi nhập dữ liệu vào cột B ở sheet 2 (có ngày ở cột A) thì nó update sang cột B sheet 3 (có ngày tương ứng), nhập dữ liệu tiếp theo cách dữ liệu trước 8 dòng thì update sang cột C, nhập lần nữa cũng cách 8 dòng thì update sang cột D (lưu ý là các khoảng dòng trống giữa 2 dữ liệu nếu có nhập vào cũng không được update qua sheet 3 hoặc các dòng trống này không cho update kiểu dữ liệu text)... Và lưu ý là khi nhập chồng dữ liệu lên dữ liệu cũ thì dữ liệu ở bên kia (sheet 3) cũng thay đổi dữ liệu mới nhập vào chứ không phải update vào cột kế tiếp. Nếu bạn chưa rõ thì mình có thể gửi file lên cho bạn nhé! Thành thật cám ơn bạn nhiều
 
Lần chỉnh sửa cuối:
Nhờ bạn HYEN và các bạn trên diễn đàn cố gắng giúp mình làm bài này nhé, xin cảm ơn nhiều!!!
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom