Sub Data()
Dim Rng As Range
Dim i As Double
i = Sheet2.Range("B5").Value
Sheet1.Select
For Each Rng In ActiveSheet.Range("B5", [b65536].End(xlUp))
If Rng.Value = i Then
Application.ScreenUpdating = False
Rng.Offset(, 1).Resize(12).Copy Sheet2.Range("C5")
Rng.Offset(, 2).Resize(12).Copy Sheet2.Range("D5")
Rng.Offset(, 3).Resize(12).Copy
Sheet2.Range("E5").PasteSpecial xlPasteValues
Rng.Offset(, 4).Resize(12).Copy
Sheet2.Range("F5").PasteSpecial xlPasteValues
Rng.Offset(, 5).Resize(12).Copy
Sheet2.Range("G5").PasteSpecial xlPasteValues
End If
Next
Application.ScreenUpdating = True
End Sub
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [b5]) Is Nothing Then
Dim Sh As Worksheet, Rng As Range, sRng As Range
Dim SoDòng As Long
Set Sh = Sheets("DuLieu")
Set Rng = Sh.Range(Sh.[b5], Sh.[B65500].End(xlUp))
Target.CurrentRegion.Offset(, 1).ClearContents
[B6].Resize(22).ClearContents
Set sRng = Rng.Find([b5].Value, , xlFormulas, xlWhole)
If sRng Is Nothing Then
MsgBox "Nothing"
Else
[b5].Resize(22).EntireRow.Hidden = False
SoDòng = sRng.Offset(, -1).End(xlDown).Row - sRng.Row - 1
If SoDòng > 16 Then SoDòng = 16
[B6].Resize(SoDòng).Value = sRng.Offset(1).Resize(SoDòng).Value
[c5].Resize(SoDòng, 6).Value = sRng.Offset(, 1).Resize(SoDòng, 6).Value
Range("H6").FormulaR1C1 = "=SUM(R[1]C:R[15]C)"
Range("H22").FormulaR1C1 = "=R[-16]C"
Range([c21], [c21].End(xlUp).Offset(2)).EntireRow.Hidden = True
End If
End If
End Sub
Bạn thử nhập thêm vài dòng dữ liệu cho mã số mới ở bên 'DuLieu', như mã tiếp theo sau mã 01.1094 là 01.1199 & nhập đúng mã đó i xì vô [B5] của 'Hien Thi' xem sao?Nhung bạn có thể viết cho minh code luon khi làm như vậy các dòng tiếp theo được ko! (khi nhập bất kỳ mã nào có trong trang dulieu thi bên hiển thị hện ra luôn..)
mình rất muốn la: khi nhập bất cứ mã gì có trong bảng dữ liệu vào cột B đều hiển thị lên như phía trên bạn làm đó!
Hiện tại ta nhập vô [B5] , thì khu vực từ dòng này cho đến dòng 21 có dữ liệu sẽ hiện lên;
Hay là bạn muốn vấn đề như vầy:
Bây giờ nhập thêm mã nào đó có ở 'DuLieu' vô ô [B25] thì fía dưới nó hiện dữ liệu của mã tương ứng vừa nhập?
Nếu vậy bạn hãy chọn cho mình chuỗi số biểu thị dòng nhập dùm cái, như
(*) 5 , 25, 45,. . .
(*) 5, 30, 55,. . . .
(*) (Chuỗi của bạn thích. . . .
Mình có một bảng rất là nhiều dữ liệu (gọi là bản dữ liệu) nó đã có sẵn ở bảng đó.
Còn bên bảng biển thị thì tại cột B mình muỗn sử dụng mã nào thì mình chỉ cần nhập đúng mã đó thôi là nó hiện ra như bạn vừa làm cho mình với ô B5 đó. Ban giúp mình với nhé!
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("B:B")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
Dim Sh As Worksheet, Rng As Range, sRng As Range
Dim SoDòng As Long
Set Sh = Sheets("DuLieu")
Set Rng = Sh.Range(Sh.[b5], Sh.[B65500].End(xlUp))
Union(Target.Offset(, 1).Resize(22, 6), Target.Offset(, -1).Resize(22)).ClearContents
Set sRng = Rng.Find([b5].Value, , xlFormulas, xlWhole)
If sRng Is Nothing Then
MsgBox "Nothing"
Else
SoDòng = sRng.Offset(, -1).End(xlDown).Row - sRng.Row - 1
If SoDòng > 19 Then SoDòng = 19
'Chép Cot B Cua DuLieu Sang Cot A:'
Target.Offset(1, -1).Resize(SoDòng).Value = sRng.Offset(1).Resize(SoDòng).Value
Target.Offset(, 1).Resize(SoDòng, 6).Value = sRng.Offset(, 1).Resize(SoDòng, 6).Value
Cells(Target.Row + 1, "H").FormulaR1C1 = "=SUM(R[1]C:R[" & SoDòng & "]C)"
Cells(Target.Row + SoDòng + 1, "H").FormulaR1C1 = "=R[-" & SoDòng + 1 & "]C"
End If
End If
End Sub
Bạn ơi! mình diễn giải lại cụ thể thế này này:
Mình có một bảng rất là nhiều dữ liệu (gọi là bản dữ liệu) nó đã có sẵn ở bảng đó.
Còn bên bảng biển thị thì tại cột B mình muỗn sử dụng mã nào thì mình chỉ cần nhập đúng mã đó thôi là nó hiện ra như bạn vừa làm cho mình với ô B5 đó. Ban giúp mình với nhé mình muốn hóc để làm đước như bạn nhưng học lâu quá không có thầy dạy nữa!
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [b:b]) Is Nothing Then
Dim Sh As Worksheet, Rng As Range, fRng As Range, iR As Byte
Set Sh = Sheets("DuLieu")
Set Rng = Sh.Range(Sh.[b5], Sh.[B65500].End(xlUp))
If Not Rng.Find(Target, , xlValues, 1, 2) Is Nothing Then
Set fRng = Rng.Find(Target, , , 1, 2).Offset(, -1)
If fRng <> "" Then
If fRng.End(xlDown).Row = 65536 Then
iR = fRng.Offset(, 2).End(xlDown).Row - fRng.Row + 1
Else
iR = fRng.End(xlDown).Row - fRng.Row
End If
With Target.Resize(iR)
.Offset(, 1).Resize(, 6) = fRng.Offset(, 2).Resize(iR, 6).Value
.Resize(, 7).Borders.LineStyle = 1
.Resize(, 7).Borders(11).LineStyle = 1
.Resize(, 7).Borders(12).LineStyle = xlDot
End With
Target.Offset(2) = fRng.Offset(, 1).End(xlDown)
End If: End If
End If
End Sub
Em thấy dường như chưa ổn Thầy SA_DQ ơi! Sao mã khác nhau mà nó lại lấy mã của cái thằng đầu tiên vậy thầy nhỉ?PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Columns("B:B")) Is Nothing Then If Target.Count > 1 Then Exit Sub Dim Sh As Worksheet, Rng As Range, sRng As Range Dim SoDòng As Long Set Sh = Sheets("DuLieu") Set Rng = Sh.Range(Sh.[b5], Sh.[B65500].End(xlUp)) Union(Target.Offset(, 1).Resize(22, 6), Target.Offset(, -1).Resize(22)).ClearContents Set sRng = Rng.Find([b5].Value, , xlFormulas, xlWhole) If sRng Is Nothing Then MsgBox "Nothing" Else SoDòng = sRng.Offset(, -1).End(xlDown).Row - sRng.Row - 1 If SoDòng > 19 Then SoDòng = 19 'Chép Cot B Cua DuLieu Sang Cot A:' Target.Offset(1, -1).Resize(SoDòng).Value = sRng.Offset(1).Resize(SoDòng).Value Target.Offset(, 1).Resize(SoDòng, 6).Value = sRng.Offset(, 1).Resize(SoDòng, 6).Value Cells(Target.Row + 1, "H").FormulaR1C1 = "=SUM(R[1]C:R[" & SoDòng & "]C)" Cells(Target.Row + SoDòng + 1, "H").FormulaR1C1 = "=R[-" & SoDòng + 1 & "]C" End If End If End Sub
Chỉ có điều bất tiện là dữ liệu cộit 'B' dưới mã fải chép sang 'A'; Lý do thì bạn tự suy diễn ra nha.
MsgBox Target.Value + 3.4, , sRng.Address & " " & sRng.Parent.Name
Em tìm ra vị trí sửa nó lại rồi Thầy ạ. Chỗ đây này:& Lỗi là do nó tưởng đó là số dạng Double
Vì mình dùng câu lệnh này thì fát hiện ra:
Đành chờ tác giả topic có í kiến về việc này vậy!PHP:MsgBox Target.Value + 3.4, , sRng.Address & " " & sRng.Parent.Name
[COLOR=#000000][COLOR=#0000bb]Set sRng [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Rng[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Find[/COLOR][COLOR=#007700]([[/COLOR][COLOR=#0000bb]b5[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000bb]Value[/COLOR][COLOR=#007700], , [/COLOR][COLOR=#0000bb]xlFormulas[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]xlWhole[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
[COLOR=#000000][COLOR=#0000bb]Set sRng [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Rng[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Find[/COLOR][COLOR=#007700](Target[/COLOR][COLOR=#007700], , [/COLOR][COLOR=#0000bb]xlFormulas[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]xlWhole[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
Nếu lỡ nhập 1 mã hiệu bên dưới rồi. Em muốn insert thêm 1 dòng trên mã hiệu vừa nhập, sau đó nhập 1 mã hiệu khác thì Mã hiệu nhập lúc đầu sẽ bị xóa và thay cho thằng mới. Vậy có cách nào khi ta nhập 1 mã hiệu mới (ở dòng vừa insert) thì nó sẽ tự động chèn thêm 1 số lượng dòng (SoDòng = sRng.Offset(, -1).End(xlDown).Row - sRng.Row - 1 ) để khỏi xóa dữ liệu của mã bên dưới không? Nảy giờ loay hoay mãi mà Em chưa nghĩ ra cách.
Tuy nhiên cũng còn 1 vấn đề nữa đó là: Nếu lỡ nhập 1 mã hiệu bên dưới rồi. Em muốn insert thêm 1 dòng trên mã hiệu vừa nhập, sau đó nhập 1 mã hiệu khác thì Mã hiệu nhập lúc đầu sẽ bị xóa và thay cho thằng mới. Vậy có cách nào khi ta nhập 1 mã hiệu mới (ở dòng vừa insert) thì nó sẽ tự động chèn thêm 1 số lượng dòng (SoDòng = sRng.Offset(, -1).End(xlDown).Row - sRng.Row - 1 ) để khỏi xóa dữ liệu của mã bên dưới không? Nảy giờ loay hoay mãi mà Em chưa nghĩ ra cách.
Mong Thầy xem giúp nhé!
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [b:b]) Is Nothing Then
Dim Sh As Worksheet, Rng As Range, fRng As Range, iR As Byte, iC As Byte
Set Sh = Sheets("DuLieu")
Set Rng = Sh.Range(Sh.[b5], Sh.[B65500].End(xlUp))
If Not Rng.Find(Target, , xlValues, 1, 2) Is Nothing Then
iC = Sh.[b5].End(xlToRight).Column - 2
Set fRng = Rng.Find(Target, , , 1, 2).Offset(, -1)
If fRng <> "" Then
If fRng.End(xlDown).Row = 65536 Then
iR = fRng.Offset(, 2).End(xlDown).Row - fRng.Row + 1
Else
iR = fRng.End(xlDown).Row - fRng.Row
End If
With Target.Resize(iR)
.Offset(1).Resize(iR - 1).EntireRow.Insert
fRng.Offset(, 2).Resize(iR, iC).Copy .Offset(, 1).Resize(, iC)
.Offset(, iC) = .Offset(, iC).Value
End With
Target.Resize(iR).Borders.LineStyle = 1
Target.Resize(iR).Borders(12).LineStyle = xlDot
Target.Offset(2) = fRng.Offset(, 1).End(xlDown)
End If: End If
End If
End Sub
OK rồi Anh à. Em muốn hỏi nâng cao hơn 1 tý, Anh xem file Em và giúp với nhé! Yêu cầu ghi rõ trong file.Xem thế này (trong file đính kèm) đã đạt yêu cầu chưa nhé
PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, [b:b]) Is Nothing Then Dim Sh As Worksheet, Rng As Range, fRng As Range, iR As Byte, iC As Byte Set Sh = Sheets("DuLieu") Set Rng = Sh.Range(Sh.[b5], Sh.[B65500].End(xlUp)) If Not Rng.Find(Target, , xlValues, 1, 2) Is Nothing Then iC = Sh.[b5].End(xlToRight).Column - 2 Set fRng = Rng.Find(Target, , , 1, 2).Offset(, -1) If fRng <> "" Then If fRng.End(xlDown).Row = 65536 Then iR = fRng.Offset(, 2).End(xlDown).Row - fRng.Row + 1 Else iR = fRng.End(xlDown).Row - fRng.Row End If With Target.Resize(iR) .Offset(1).Resize(iR - 1).EntireRow.Insert fRng.Offset(, 2).Resize(iR, iC).Copy .Offset(, 1).Resize(, iC) .Offset(, iC) = .Offset(, iC).Value End With Target.Resize(iR).Borders.LineStyle = 1 Target.Resize(iR).Borders(12).LineStyle = xlDot Target.Offset(2) = fRng.Offset(, 1).End(xlDown) End If: End If End If End Sub
OK rồi Anh à. Em muốn hỏi nâng cao hơn 1 tý, Anh xem file Em và giúp với nhé! Yêu cầu ghi rõ trong file.
OK rồi, chỉ còn cái này nữa Anh xem xử lý giúp luôn nhé!Xem file đính kèm và kiểm tra lại xem còn lỗi gì không nhé (đã xử lý bỏ 3 cột phụ H; I; J tại sheet Dinhmuc)
OK rồi, chỉ còn cái này nữa Anh xem xử lý giúp luôn nhé!
1/Bên sheet KL sao Em insert 1 dòng nữa nó lại BÁo lỗi nhỉ?
2/Nếu insert 1 dòng sau đó nhập 1mã hiệu khác thì số thứ tự nó không tự động nhập lại, Anh xem lại luôn nhé!
Thanks.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sh As Worksheet, iR As Long, eR As Long
Dim Rng As Range, fRng As Range, eRng As Range, clls As Range, sRng As Range
If Not Intersect(Target, [b:b]) Is Nothing Then
On Error Resume Next
Set Sh = Sheets("Dinhmuc")
Set Rng = Sh.Range(Sh.[B2], Sh.[B65500].End(xlUp))
If Target <> "" And Not Rng.Find(Target, , xlValues, 1, 2) Is Nothing Then
Set fRng = Rng.Find(Target, , xlValues, 1, 2)
Set eRng = fRng.End(xlDown): iR = fRng.Row
eR = IIf(eRng.Row > 65535, fRng.Offset(, 1).End(xlDown).Row, eRng.Row)
For Each clls In [b5].Resize([b6535].End(xlUp).Row - 4)
If clls <> "" Then
clls.Offset(, -1).FormulaR1C1 = "=COUNTA(r5c[1]:rc[1])"
clls.Offset(, -1) = clls.Offset(, -1).Value
Else
clls.Offset(, -1) = ""
End If
Next
Target.Offset(, 1).Resize(, 2) = Sh.Cells(iR, "C").Resize(, 2).Value
For Each clls In [g4:i4]
For Each sRng In fRng.Offset(, 1).Resize(eR - iR)
If InStr(sRng, clls) > 0 Then Cells(Target.Row, clls.Column) = sRng.End(xlToRight).Value
Next
Next
Else
With Target.Offset(, 1)
Union(.Offset(, -2), .Resize(, 2), .Offset(, 4).Resize(, 3)).ClearContents
End With
End If
End If
End Sub
Sheet Dinhmuc là sheet phân tích đơn giá dự toán. Khi Bạn nhập mã hiệu bên sheet KL thì nó tự động dò tìm bên sheet Dinhmuc để cho ra đơn giá. Còn bên sheet PTVT khi Bạn chọn vào sheet này nó sẽ tự động phân tích vật tư cho Bạn. Bạn tải file sau về cập nhật định mức đơn giá cho sheet Dinhmuc (để làm sheet tổng dò tìm)Cho hỏi bạn minh công xíu:
Trong file cuả bạn phần đơn giá bạn làm cách nào mà không thấy sheet trong file mà vẫn nhảy tiên lượng khi nhập mã hiệu công việc vào vậy
(1) Bạn bảo với chương trình là có lỗi thì đi tiếp;(1) Sao mình làm trên file này không được nhỉ!
(2) Mình muốn nhờ diễn đàn làm giúp mình luôn với file dữ liệu đính kèm!
* Trong bảng DuLieu có rât nhiều mã khác nhau, nếu muốn dùng mã nào thì chỉ cần nhập mã đó vào cột B của bảng Hienthi là nó hiện ra mã đó; (3) Sau đó kết quả được tổng hợp vào một bảng Tonghop bên cạnh.
Sao trong file này, phần Định mức thì không nói rồi, nhưng bên sheet KL khi nhập số hiệu vào thì trong sheet tự động nhảy đơn giá của vật liệu, nhân công, ca máy. Mình muốn thay đổi đơn giá đó của bạn thành đơn giá ban hành theo tỉnh mình thì lại không thấy phần để thay đổi, còn Định mức thì hiện nay dùng chung định mức 1776 phải ko bạn?Sheet Dinhmuc là sheet phân tích đơn giá dự toán. Khi Bạn nhập mã hiệu bên sheet KL thì nó tự động dò tìm bên sheet Dinhmuc để cho ra đơn giá. Còn bên sheet PTVT khi Bạn chọn vào sheet này nó sẽ tự động phân tích vật tư cho Bạn. Bạn tải file sau về cập nhật định mức đơn giá cho sheet Dinhmuc (để làm sheet tổng dò tìm)
Không cần biết dùng định mức gì, Định mức 24, định mức 1776.....Bạn chỉ cần vào sheet Dinhmuc -> Cập nhật và chỉnh sửa theo định mức Bạn đang dùng -> Sau đó vào sheet KL nhập mã hiệu đơn giá của Bạn. (Bên sheet KL chẳng qua là khi Bạn nhập 1 mã hiệu nào đó thì nó sẽ dò tìm mã hiệu bên sheet Dinhmuc sau đó điền kết quả bên sheet KL)Sao trong file này, phần Định mức thì không nói rồi, nhưng bên sheet KL khi nhập số hiệu vào thì trong sheet tự động nhảy đơn giá của vật liệu, nhân công, ca máy. Mình muốn thay đổi đơn giá đó của bạn thành đơn giá ban hành theo tỉnh mình thì lại không thấy phần để thay đổi, còn Định mức thì hiện nay dùng chung định mức 1776 phải ko bạn?