Update dữ liệu

Liên hệ QC
Nhờ các bạn trên diễn đàn cố gắng giúp mình làm bài này nhé!!!

Như vậy là bạn có thể nhập thêm bên sheet3 là 6 cột (Từ B->H) tối đa.

Tại Sheet2 tại ô A5 bạn nhập ngày nào đó; Và ở cột 'B' các dòng 5 + (8* r) bạn sẽ nhập các số trị để chép sang S3 đúng theo cột tương ứng yêu cầu:
dòng 5 => Cột B
Dòng 13 => cột C;
. . . .
Dòng 45 => Cột H

Xin bạn khẳng định lại điều này, rằng vùng A6:A45 là vùng trắng hoàn toàn?

Điều này rất quan trọng, có ảnh hưởng rất lớn đến phương cách macro sẽ phải làm việc.

Không thể cứ mỗi lần bạn lại lấy từ trên trời xuống thêm một điều kiện như các bài trên vậy
được.

Chờ tin bạn!:-=
 
Vâng, đúng vậy. Từ A6-A45 ở sheet 2 là trống hoàn toàn, còn cột A bên sheet 3 là các ngày trong tháng. Có nghĩa là lookup ngày ở sheet 2 update sang sheet 3 (có ngày tương ứng là được). Cám ơn SA_DQ nhiều!!!
 
Lần chỉnh sửa cuối:
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
         nRw = 1:                      Set Dat = .Offset()
      Else
         Set Dat = .End(xlUp):      nRw = Range(.Offset(), .Offset().End(xlUp)).Rows.Count
      End If
   End With
   nRw = Switch(nRw < 7, 1, nRw < 15, 2, nRw < 24, 3, nRw < 32, 4, nRw < 40, 5, _
      nRw < 48, 6, nRw < 55, 7, nRw > 54, 8)
   If nRw > 7 Then Exit Sub
   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
      sRng.Offset(, nRw).Value = Target.Value
   End If
   Rng.NumberFormat = "[$-409]d-mmm;@"
 End If
End Sub
 
Hi HYen, Mình làm được rồi, code đã đúng theo yêu cầu! Một lần nữa cám ơn bạn đã nhiệt tình giúp đỡ!!!!!!!!!! Thân.
 
Lần chỉnh sửa cuối:
Hi HYen, Có 1 trục trặc nho nhỏ: khi update qua sheet3 thì ô tháng của mình bị đổi dạng format, bạn sửa lại dùm mình nhé, Cám ơn nhiều!!!
 

File đính kèm

Lần chỉnh sửa cuối:
Có 1 trục trặc bị đổi dạng format, bạn sửa lại dùm mình nhé, Cám ơn nhiều!!!

Trong macro đã có lệnh format lại cột ngày tháng như dạng của nó vốn có ban đầu;

Nếu lệnh này chưa đúng í bạn, thì bạn có thể ghi lại bằng bộ thu & thay cho dòng lệnh định dạng cuối macro xem sao;

Mình nghĩ rằng chuyện này trong tầm tay của bạn mà!

Chúc thành công! :-= }}}}} :-=
 
Hi HYen, Làm phiền bạn lần nữa nhé. Mình muốn update dữ liệu sang nhiều sheet thì làm thế nào. VD: Dữ liệu từ dòng 6 tới dòng 54 thì update sang sheet3, còn từ dòng 55 tới dòng 100 thì update sang sheet4, từ dòng 101... thì update sang sheet5. Chẳng lẻ để update sang từng sheet thì phải có một sheet phụ kèm theo. Bạn cố gắng giúp mình nhé, cám ơn HYen nhiều!!! Chúc một ngày vui vẻ!!!
 
Lần chỉnh sửa cuối:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B2:B199")) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range, Dat As Range
   Dim nRw As Long
   
   With Target.Offset(, -1)
      If .Value <> "" And IsDate(.Value) Then
         nRw = 1:                Set Dat = .Offset()
      Else
         Set Dat = .End(xlUp):   nRw = Range(.Offset(), .Offset().End(xlUp)).Rows.Count
      End If
   End With
   
   Set Sh = Sheets(Switch(nRw < 55, "Sheet3", nRw < 109, "Sheet4", nRw > 108, "Sheet5"))
   Set Rng = Sh.Range(Sh.[a4], Sh.[A65500].End(xlUp))
   Rng.NumberFormat = "m/d/yyyy"
   
   nRw = nRw Mod 56

   nRw = Switch(nRw < 7, 1, nRw < 15, 2, nRw < 24, 3, nRw < 32, 4, nRw < 40, 5, _
      nRw < 48, 6, nRw < 55, 7)
   
   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
      sRng.Offset(, nRw).Value = Target.Value
   End If
   Rng.NumberFormat = "[$-409]d-mmm;@"
 End If
End Sub
 
PHP:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range)  If Not Intersect(Target, Range("B2:B199")) Is Nothing Then    Dim Sh As Worksheet, Rng As Range, sRng As Range, Dat As Range    Dim nRw As Long      With Target.Offset(, -1)       If .Value  "" And IsDate(.Value) Then          nRw = 1:                Set Dat = .Offset()       Else          Set Dat = .End(xlUp):   nRw = Range(.Offset(), .Offset().End(xlUp)).Rows.Count       End If    End With      Set Sh = Sheets(Switch(nRw < 55, "Sheet3", nRw < 109, "Sheet4", nRw > 108, "Sheet5"))    Set Rng = Sh.Range(Sh.[a4], Sh.[A65500].End(xlUp))    Rng.NumberFormat = "m/d/yyyy"      nRw = nRw Mod 56      nRw = Switch(nRw < 7, 1, nRw < 15, 2, nRw < 24, 3, nRw < 32, 4, nRw < 40, 5, _       nRw < 48, 6, nRw < 55, 7)      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       sRng.Offset(, nRw).Value = Target.Value    End If    Rng.NumberFormat = "[$-409]d-mmm;@"  End If End Sub
Chỉ tại mình diễn đạt không đủ hết ý mình nên bạn thông cảm nhé--=0!!! Cho mình hỏi thêm nhé: Thứ 1: Set Sh = Sheets(Switch(nRw < 55, "Sheet3", nRw < 109, "Sheet4", nRw > 108, "Sheet5")). Dòng này nếu mở rộng ra thêm nhiều sheet nữa thì có phải như vậy không? Set Sh = Sheets(Switch(nRw < 55, "sheet3", nRw < 109, "Sheet4", nRw < 163, "sheet5", nRw < 117, "sheet6", nRw < 171, "sheet7"..., nRw > (n-1)*54, "sheetn")). Thứ 2: Bạn giải thích dùm mình dòng này nRw = nRw Mod 56? Có phải tổng số dòng/56 (7 cột 8 dòng không)??? Thứ 3: Mình sẽ áp dụng trong công việc khác, thay vì cứ cách 8 dòng thì update sang cột bên cạnh - nhưng bây giờ mình muốn nó cách 3,4,5 dòng thì sửa đoạn code sau đây như thế nào?: nRw = Switch(nRw < 7, 1, nRw < 15, 2, nRw < 24, 3, nRw < 32, 4, nRw < 40, 5, _ nRw < 48, 6, nRw < 55, 7). Mình nghĩ khi thay đổi thì nó cũng ảnh hưởng 2 đoạn code trên Vd: nếu muốn cách 4 dòng nhập dliệu thì update sang cột bên cạnh thì sửa lại như vầy không? nRw = Switch(nRw < 3, 1, nRw < 7, 2, nRw < 11, 3, nRw < 15, 4, nRw < 19, 5, _ nRw < 23, 6, nRw < 27, 7). Cám ơn bạn rất nhiều HYen à!!! Thân.
 
Lần chỉnh sửa cuối:
Chỉ tại mình diễn đạt không đủ hết ý mình nên bạn thông cảm nhé--=0!!! Cho mình hỏi thêm nhé:
Thứ 1:
Set Sh = Sheets(Switch(nRw < 55, "Sheet3", nRw < 109, "Sheet4", nRw > 108, "Sheet5")). Dòng này nếu mở rộng ra thêm nhiều sheet nữa thì có phải như vậy không?
Set Sh = Sheets(Switch(nRw < 55, "sheet3", nRw < 109, "Sheet4", nRw < 163, "sheet5", nRw < 117, "sheet6", nRw < 171, "sheet7"..., nRw > (n-1)*54, "sheetn")).

Để hiểu vấn đề này sao bạn không dùng ngay chính excel:

Tại cột 'A' của dòng 1 của trang tính mới ta nhập số 5; [b1]:=13;
Sau đó tô chọn 2 ô này & Fill to Right cho đến cột 'Z' .
Bạn tô màu nền cách nhau 7 cột thì sẽ dễ đối chiếu & hiểu câu lệnh trên;

Thực ra tôi hay dùng hàm SWITCH() trong VBA hơn, chứ chúng ta có thể hoàn toàn dùng If. . End If, hay Select Case . . trong trường hợp này & tất nhiên dài dòng hơn;

Tuy nhiên câu của bạn định thay thế còn đang sai; Bạn hãy dùng kết quả mà excel đưa lại cho bạn để đưa vô hàm SWITCH() nêu trên

Thứ 2: Bạn giải thích dùm mình dòng này
nRw = nRw Mod 56? Có phải tổng số dòng/56 (7 cột 8 dòng không)???
Đúng như bạn hiểu (Giống như đặt thừa số chung mà chúng ta học ở cấp II vậy thôi

Thứ 3:
Mình sẽ áp dụng trong công việc khác, thay vì cứ cách 8 dòng thì update sang cột bên cạnh - nhưng bây giờ mình muốn nó cách 3,4,5 dòng thì sửa đoạn code sau đây như thế nào?:
nRw = Switch(nRw < 7, 1, nRw < 15, 2, nRw < 24, 3, nRw < 32, 4, nRw < 40, 5, _
nRw < 48, 6, nRw < 55, 7).

Mình nghĩ khi thay đổi thì nó cũng ảnh hưởng 2 đoạn code trên

Vd: nếu muốn cách 4 dòng nhập dliệu thì update sang cột bên cạnh thì sửa lại như vầy không?

nRw = Switch(nRw < 3, 1, nRw < 7, 2, nRw < 11, 3, nRw < 15, 4, nRw < 19, 5, _
nRw < 23, 6, nRw < 27, 7).
Cám ơn bạn rất nhiều HYen à!!!
Thân.
Hãy nghiên cứu kỹ thêm về biến nRw;

Như mình thường làm đó là lệnh
Mã:
 MsgBox nRw,,"Vi Tri Hien Thoi"
:-=
 
--=0Cám ơn bạn!!! Mình đã hiểu ý định của bạn, nhưng hình như v/d thứ 3 mình thấy bạn làm dư 1 dòng khi update sang cột thứ 4 - bởi mình không thấy 1 quy tắc nào cả nên mình mới hỏi bạn thêm, có phải vậy không? hehehe!!! Rất cám ơn bạn đã nhiệt tình giúp mình!!! Hy vọng gặp lại bạn trong những câu hỏi lần sau nhé!!! Chúc bạn may mắn và thành công trong công việc & trong cuộc sống!!!}}}}} Thân.
 
Lần chỉnh sửa cuối:
Để tiến tới xây dựng 1 macro tổng quát:

Bạn lấy 1 trang tính mới & cho macro sau chạy trên nó:

PHP:
Option Explicit
Sub ToMau()
 Dim b7 As Byte, Jj As Byte, Z3 As Byte, Color As Byte, Step_ As Byte
 
 Columns("B:D").ClearFormats
 Range("B1:Z3").Clear:              [a5] = Date
 For Z3 = 1 To 3
   Step_ = Switch(Z3 = 1, 3, Z3 = 2, 5, Z3 = 3, 8)
   Cells(Z3, "B").Value = Step_ & " Rows"
     
   Color = 34
   For Jj = 1 To 255 Step Step_
      b7 = b7 + 1
      Cells(4 + Jj, Z3 + 1).Interior.ColorIndex = Color
      With Cells(Z3, "iV").End(xlToLeft).Offset(, 1)
         .Interior.ColorIndex = Color
         .Value = 4 + Jj
      End With
      If b7 = 7 Then
         b7 = 0:           Color = Color + 2
      End If
      If Color = 40 Then Exit For
   Next Jj
 Next Z3
End Sub

(Như cách mình gọi: Đây là macro cái, Vì macro này chuẩn bị đẻ ra macro con:-=)
 
Hoàn hảo đến thế là cùng! Cám ơn HYen nhiều nhé!!!--=0 Thân.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom