Chuyển đổi dữ liệu (1 người xem)

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

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

HuuThanh

Thành viên chính thức
Tham gia
4/1/07
Bài viết
70
Được thích
109
Em có một bảng tính (file gửi kèm)
Em muốn lập một cái macco hay công thức để chuyển đổi dữ liệu như em đã minh họa trên.
- Tại cột A* (ví dụ A8) nhập vào trừ giá trị đầu tiên có giá trị là 0, các ô sau nếu có giá trị là 0 thì chuyển sang ô G* (ví dụ G8) tương ứng
- Các ô trên giá trị 0
G7=G8+A7
G6=G7+A6
......
G3 (dưới ô có giá trị S) = G4+A3
- Các o dưới giá trị 0
G9=G8+A9
G10=G9+A10
.....
G16(trên ô có giá trị E)=G15+A16

- Khi ô A* (ví dụ A8) có giá trị 0 thì chuyển nguyên ô B* (ví dụ B8) sang ô H* (ví dụ H8)
- Các ô trên giá trị 0
H7=$B$8+B7
H6=$B$8+B6
......
H3=$B$8+B3
- Các o dưới giá trị 0
H9=$B$8+B9
H10=$B$8+B10
.....
H16=$B$8+B16
- Các ô màu xanh chuyển sang tương ứng
Thực hiện chuyển đổi hết dữ liệu sang như em đã mô tả trên.
Rất mong các anh chỉ bảo giúp em. Em xin chân thành cảm ơn !!!
 

File đính kèm

Hãy dùng công thức IF cho đơn giản.
 
Thích macro thì có macro

* Bạn phải chuột lên thanh sheetName có tên là 'NguyenGoc' (Chú í: Tên các sheets nên viết liền - không có khoảng trống; Điều này không bắt buộc, cũng giống như ta muốn đi 1 chân trên vĩa hè & 1 chân dưới lòng đường cũng không ai cấm!)
* Chọn dòng cuối của CS vừa đổ xuống
* Chép toàn bộ macro này vô CS VBE vừa xuất hiện;

Chúc thành công!
PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 On Error Resume Next
 Dim jZ As Long
 
 If Not Intersect(Target, Range("A2:A999")) Is Nothing And Target = 0 Then
    With Target
        .Offset(, 6) = 0:                           jZ = .Row
        .Offset(, 7) = .Offset(, 1)
    End With
    Do
        jZ = jZ - 1
        If IsNumeric(Cells(jZ, 1)) = False Then
            Cells(jZ, 7) = Cells(jZ, 1):            Exit Do
        End If
            Cells(jZ, 7) = Cells(jZ + 1, 7) + Cells(jZ, 1)
            Cells(jZ, 8) = Cells(jZ + 1, 8) + Cells(jZ, 2)
    Loop
    jZ = Target.Row
    Do
        jZ = jZ + 1
        If IsNumeric(Cells(jZ, 1)) = False Then
            Cells(jZ, 7) = Cells(jZ, 1):            Exit Do
        End If
            Cells(jZ, 7) = Cells(jZ - 1, 7) + Cells(jZ, 1)
            Cells(jZ, 8) = Cells(jZ - 1, 8) + Cells(jZ, 2)
    Loop
 End If
End Sub
 
Em xin cám ơn các anh !!!
Cám ơn anh SA_DQ nhiều nhiều, em làm cái bảng tính này mệt lắm cứ cộng, trừ rồi lại dò số 0, nhiều lúc nhầm lung tung. Tối qua e mới viết lên mong các anh chỉ giúp, hôm nay đã có bài trả lời rồi, thực lòng cám ơn anh nhiều, chúc anh sức khỏe và thành công! Cho em xin hỏi mọt chút nữa: Sau khi em sủa lại tên sheet viết liền nhau, em copy code vào cửa sổ VBA để chạy nhưng chương trình cứ yêu cầu tạo thêm maco nữa. Em cũng không biết nhiều lắm mon anh giúp em !!!
 
Xem trong file đính kèm

PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 On Error Resume Next
 Dim jZ As Long
  
 If Not Intersect(Target, Range("A2:A999")) Is Nothing And Target = 0 Then
    With Target
        .Offset(, 6) = 0:                           jZ = .Row
        .Offset(, 7) = .Offset(, 1)
    End With
    Do
        jZ = jZ - 1
        If IsNumeric(Cells(jZ, 1)) = False Then
            Cells(jZ, 7).Interior.ColorIndex = Cells(jZ, 1).Interior.ColorIndex
            Cells(jZ, 7) = Cells(jZ, 1):                      Exit Do
        End If
            Cells(jZ, 7) = Cells(jZ + 1, 7) + Cells(jZ, 1)
            Cells(jZ, 8) = Cells(jZ + 1, 8) + Cells(jZ, 2)
    Loop
    jZ = Target.Row
    Do
        jZ = jZ + 1
        If IsNumeric(Cells(jZ, 1)) = False Then
            Cells(jZ, 7).Interior.ColorIndex = Cells(jZ, 1).Interior.ColorIndex
            Cells(jZ, 7) = Cells(jZ, 1):            Exit Do
        End If
            Cells(jZ, 7) = Cells(jZ - 1, 7) + Cells(jZ, 1)
            Cells(jZ, 8) = Cells(jZ - 1, 8) + Cells(jZ, 2)
    Loop
 End If
End Sub
Hướng dẫn bạn 1 chút:
* Macro đang trong sheets("NguyenGoc") & mình đã thử chạy nó bằng cách tại ô A8 mình nhập số '0' & {ENTER}, macro đã thể hiện cách làm theo iêu cầu của bạn;
Còn 1 vài số '0' trên cột 'A', bạn có thể tiếp tục thử cho thành thục;
* Mình chưa rõ lắm; như theo quy trình thì dẫy số trên & dưới số 0 trên cột 'A' đã phải có? Nếu không đủ thì macro sẽ thực thi nữa vời mà thôi!

Chờ tin bạn!
 

File đính kèm

Mình cảm ơn bạn nhiều lắm. Ý mình la minh không biết làm thế nào đê chạy cái đoạn mã bạn viết. Mình copy vào cửa sổ VBA sau đó chạy nhưng nó cứ báo răng cần phải đặt cái MACO mình cũng không biết phải làm thế nào nữa.
Bạn thông cảm cho minh nhé, vì mình thực sự không rành lắm ! Nếu có thể bạn gửi lại cho mình cái file ma bạn chạy được không ? Cảm ơn bạn rất nhiều !!!
 
Lần chỉnh sửa cuối:
Được rồi. Tốt quá anh ạ. Em lại không hiểu cách sử dụng lắm lên cứ lơ mơ. Em đã làm lại đúng như anh hướng dẫn là được rồi. Có một số chỗ không tự động copy giá trị "EG" sang. Cho em xin hỏi có thể chỉnh lại đê khi mình đã có một bảng nhập số liệu rồi chỉ cần kích một cái vào một nút là chạy chuyển cả bảng không anh? Em cảm ơn anh SA_DQ nhiều lắm !!!
 
Được rồi anh ạ. . . . Cho em xin hỏi có thể chỉnh lại đê khi mình đã có một bảng nhập số liệu rồi chỉ cần kích một cái vào một nút là chạy chuyển cả bảng không anh? Em cảm ơn anh SA_DQ nhiều lắm !!!
Thứ nhất, Vì lí do tế nhị, bạn không nên dùng ngôi số 2 số ít trong trường hợp này:
". . . . chạy chuyển cả bảng không anh? ". Vì lỡ mình vắng lâu trên diễn đàn, sẽ có 1 số người cũng biết nhưng sẽ không đưa bài trả lời lên cho bạn đâu!
Thứ nhì, Phương án thực thi là có; Ví dụ:
* Tìm lần lượt từng ô chứa trị số '0' từ trên xuống; Nếu gặp thì thay từ đó cho đến khi gặp ô không chứa ký số thí lại tìm tiếp. . .
* Sau đó lại tìm ngược từ dưới lên, nhưng cũng thực hiện việc chép sang . . . cho đến khi gặp ký tự trong ô ;
Nếu dữ liệu của bạn theo cột 'A' đúng như vầy:
N x, xxx,. . . xx, 0 xxx, xxxx, G, x, xxx,. . . xx, 0 xxx, xxxx, P. . . . . . . . . . . , x, xxx,. . . xx, 0 xxx, xxxx, E
Thứ ba, hãy ấn nút 'Thank', Xin cảm ơn!!
 
Từ 9h30 đến giờ & kết quả đây: Trong file đính kèm

Đọc kỹ hướng dẫn sử dụng trước khi dùng:

Nút chạy macro mình để bên sheets("S1")
Trước khi chạy, ta sang sheets thứ 2, chọn các cột trước cột 'I'
bấm {CTRL}+C;
Sang sheets có nút lệnh & chọn 'A1'
Vô menu Edit để dán Special, & chọn All trong CS vừa xuất hiện.

Chúc thành công.:-=

PHP:
Option Explicit
Const GiaTri As Double = 400
Sub CopyFor0()
 Dim lRow As Long, jJ As Long, RowB As Long, Row0 As Long
 Dim Rng As Range
 
 Sheets("S1").Select:               lRow = [a65432].End(xlUp).Row + 1
 For jJ = 2 To lRow
    With Cells(jJ, 1)
        If Not IsNumeric(.Value) Then
            .Resize(1, 2).Copy Destination:=.Offset(, 6)
            If Row0 = 0 Then
                RowB = .Row + 1
            Else
                Set Rng = Range("A" & RowB & ":A" & (.Row - 1))
                GPE_com Rng, Row0:              Row0 = 0
            End If
        End If
        If .Value = 0 And .Offset(, 1) > GiaTri Then
            Row0 = .Row:            .Resize(1, 2).Copy Destination:=.Offset(, 6)
        End If
    End With
 Next jJ
End Sub

Mã:
[B]Sub GPE_com(Clls As Range, VTri0 As Long)[/B]
 Dim mRow As Long, Zz As Long, RowM As Long
 Dim GTri0 As Double:               Dim Rng As Range, Rng9 As Range
 
 GTri0 = Range("B" & VTri0):        mRow = Clls.Cells(1, 1).Row
 RowM = mRow + Clls.Rows.Count - 1
 Set Rng9 = Range("A" & (VTri0 + 1) & ":A" & RowM)
 For Each Rng In Rng9
    With Rng
        .Offset(, 6) = .Value + .Offset(-1, 6)
        .Offset(, 7) = GTri0 + .Offset(, 1)
    End With
 Next Rng
 For Zz = (VTri0 - 1) To mRow Step -1
    With Cells(Zz, 1)
        .Offset(, 6) = .Value + .Offset(1, 6)
        .Offset(, 7) = GTri0 + .Offset(, 1)
    End With
 Next Zz
[B]End Sub[/B]
 

File đính kèm

Giờ mới nhìn kỷ lại bài này... Thấy dùng công thức bình thường cũng đơn giãn lắm mà... Quan trong nhất là định vị dc vị trí của số 0 trong bảng là xong!
Bạn xem file thử thế nào nhé!
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Kỷ nữa đi, AnhTuan1066!!!

:-=
Quan trong nhất là định vị dc vị trí của số 0 trong bảng là xong! Bạn xem file thử thế nào nhé! ANH TUẤN
ANHTUAN1066 Thử thay 1 số nào đó trong cột 'A' bằng số 0 sẽ chưa đạt theo iêu cầu của tác gia rồi!
Xem cột 'A' bài đầu đi AnhTuan1066 à, đến 4 số 0 nhưng chỉ xài 1 trong chúng mà thôi;
Mình cũng loai hoay cái này mất hơn giờ đồng hồ í chứ!:-=
 
:-=
ANHTUAN1066 Thử thay 1 số nào đó trong cột 'A' bằng số 0 sẽ chưa đạt theo iêu cầu của tác gia rồi!
Xem cột 'A' bài đầu đi AnhTuan1066 à, đến 4 số 0 nhưng chỉ xài 1 trong chúng mà thôi;
Mình cũng loai hoay cái này mất hơn giờ đồng hồ í chứ!:-=
Cái này em có nghĩ qua, nhưng vì trong tất cả các dử liệu giã lập, tác giã luôn cho cột A duy nhất 1 số 0... Bám vào đó mà làm thôi...
Để đợi xem tác giã nói thế nào đã
(ngay cả trong các mục giãi thích cũng ko thấy tác giã nói về vụ có 2 số 0 nên em đoán chắc có lẽ đây là điểm gốc)
ANH TUẤN
 
Cái này em có nghĩ qua, nhưng vì trong tất cả các dử liệu giã lập, tác giã luôn cho cột A duy nhất 1 số 0... Bám vào đó mà làm thôi...
Để đợi xem tác giã nói thế nào đã
(ngay cả trong các mục giãi thích cũng ko thấy tác giã nói về vụ có 2 số 0 nên em đoán chắc có lẽ đây là điểm gốc)
ANH TUẤN

Số 0 ở Dữ liệu này có ý nghĩa là tâm (cọc tim / hoặc gì đó) => chỉ có 1 số 0, chắc vậy -
Đợi tác giả xác nhận
.
 
Trong khi chờ đợi tác giã có ý kiến, mình cải tiến lại file xem nào! Bỏ name luôn để khi qua bảng khác khỏi mất công đặt name lần nữa!
(vẫn trên quan điểm chỉ có 1 số 0 duy nhất trong bảng, và lấy nó làm điểm gốc)
ANH TUẤN
 

File đính kèm

Đâu có vậy đâu AnhTuan1066!

Cái này em có nghĩ qua, nhưng vì trong tất cả các dử liệu giã lập, tác giã luôn cho cột A duy nhất 1 số 0... Bám vào đó mà làm thôi... (ngay cả trong các mục giãi thích cũng ko thấy tác giã nói về vụ có 2 số 0 nên em đoán chắc có lẽ đây là điểm gốc)
ANH TUẤN

ChuyenDL.jpg
AnhTuan1066 thử với vùng này xem sao?! lấy từ #1 đó nha, hoàn toàn không bịa đâu!
 
Em xin nói rõ nội dung bài em đã hỏi cho các anh các bạn biết.
Đó là file sử lý số liệu khảo sát trong đo đạc nền đường.

0.00
S EG
-1.40 -0.05
-1.35 -0.02
0.00 578.36
1.19 0.01
1.58 -0.01
E

*Ban đầu số liệu ở đạng tương đối so với cọc trước nó (Nhưng dang này không tương thích với số liệu đầu vào của chương trình mình thiết kế.)
Cột A:
-Giá trị đầu tiên là lý trình của một mặt cắt ngang trong tuyến (bắt đầu một mặt căt).
- Ký tự ở dòng tiếp theo "S" ký tự mô tả mặt bằng.
- Ký tự "E" cho biết kết thúc một mặt cắt.
- Các giá trị trong Koảng từ "S" -> "E" biểu diễn khoảng cách tương đối từ tim ra.
Trong đó giá trị 0 ở vị trí tim đường, các giá trị âm mô tả sang trái, giá trị dương mô tả sang phải. Nhưnng nó tính tương đối cọc sau so với cọc trước nó.
Cột B:
-Giá trị "EG" mô tả tên mặt bằng.
-Các giá tương ứng với cột A từ "S" -> "E" biểu diễn cao độ của các vị trí tương ứng. Chỉ duy nhất có giá trị tương ứng với vị trí "0" là cao độ tuyệt đối. Các giá trị khác là các giá trị tương đối so với cọc trước nó. (Trong bài em gửi em cũng mô tả nhầm là tương đối so với tim. Nhưng chính xác phải là chênh cao tương đối so với cọc trước nó. Cái này mong các anh hết sức thông cảm, nếu được nhờ các anh chỉnh lại cho em là tương đối so với cọc trước nó giúp em. Có nghĩa là kết quả cao độ tại vị trí bên trái (hay bên phải) đầu tiên lấy cao độ tuyệt đối của vị trí có giá trị 0 (cọc tim) cộng với chính nó, vị trí kế tiếp lấy chính nó cộng với giá trị tuyệt đối vừa tính được ở cọc ngay trước nó).

VD
S EG
-1.40 -0.05
-1.35 -0.02
0.00 578.36
1.19 0.01
1.58 -0.01
E
(bê trái)
+ Tại cọc cạnh cọc tim là: 578.36+(-0.02)=578.34
+ Tại cọc kế tiếp là: 578.34+(-0.05)=578.29
(bên phải)
+ Tại cọc đầu tiên: 578.36+0.01=578.37
+ Tại cọc thứ 2: 578.37+(-0.01)=578.36
vậy nhờ anh chỉnh lại trong công thức giúp em với!

*Kết thúc một cấu trúc như vậy là kết thúc một mặt cắt, và bắt đầu sang một mặt cẳt khác. Chương trình này hữu ích vì trên 1km có gần một trăm mặt cắt phải tính tay thì mệt khủng khiếp mà cũng không chắc là không nhầm lẫn.

* Số liệu sau khi chuyển ở đạng tuyệt đối đáp ứng yêu cầu của phần mềm thiết kế
Chương trình chạy rất tốt rồi. Em thực sự cám ơn các anh, các bạn. Tiện ích nhỏ này mang lại tiện ích rất lớn cho mình. Nếu tự bản thân em thì đó là điều không thể mơ tới. Hiện tại em đang ở Hà Nội, nếu được xin cảm ơn các anh, các bạn bằng một chầu cafe tại hà nội vào thời gian tùy ý các anh. Nếu các anh, các bạn có thời gian cho mình xin được gặp gỡ
 
Lần chỉnh sửa cuối:
* Số liệu sau khi chuyển ở đạng tuyệt đối đáp ứng yêu cầu của phần mềm thiết kế. Chương trình chạy rất tốt rồi. Em thực sự cám ơn các anh, các bạn. Tiện ích nhỏ này mang lại tiện ích rất lớn cho mình. Nếu tự bản thân em thì đó là điều không thể mơ tới.
* Hiện tại em đang ở Hà Nội, nếu được xin cảm ơn các anh, các bạn bằng một chầu cafe tại hà nội vào thời gian tùy ý các anh. Nếu các anh, các bạn có thời gian cho mình xin được gặp gỡ (ĐT 0979898636)
Tác gia topic chú í câu lệnh: Const GiaTri As Double = 400
Theo số liệu HuuThanh đưa lên, mình lấy chuẩn này để phân biệt với các trường hợp giá trị 0 khác (do tình cờ không có độ lệch). Khi vận hành macro chú í thay đổi cho phù hợp với kết quả đo đạt trên hiện trường. Mình nghỉ, khai báo tối ưu giá trị của hằng này sẽ là trung bình nhân giữa giá trị Max( độ lệnh) & Min( Giá trị tại điểm gốc)
Còn phần cà fê của mình, nêu có: hãy bỏ vô bịch xốp (túi ni lon) gỏi ai có dịp vô trong này cái; Xin cảm ơn trước!!!

Vui nha!!!
 
Lần chỉnh sửa cuối:
Em xin nói rõ nội dung bài em đã hỏi cho các anh các bạn biết.
Đó là file sử lý số liệu khảo sát trong đo đạc nền đường.

Nếu vậy thường tôi thấy người ta bố trí Dữ liệu theo dòng cho dễ lập công thức bạn ah, cụ thể 1 mặt cắt như sau:

dòng 1: <Tên cọc> <Cao độ Tim>
dòng 2: <kc sang trái 1> <kc sang trái 2> ....
dòng 3: <độ chênh trái 1> <độ chênh trái 2> ....
dòng 4: <kc sang phải 1> <kc sang phải 2> ....
dòng 5: <độ chênh phải 1> <độ chênh phải 2> ....

Khi chuyển sang Tuyệt đối
dòng 1: <Tên cọc> <Cao độ Tim>
dòng 2: <kc sang trái tđ 1> <kc sang trái tđ2> ....
dòng 3: <cao độ tđ trái 1> <cao độ tđ trái 2> ....
dòng 4: <kc sang phải tđ 1> <kc sang phải tđ2> ....
dòng 5: <cao độ tđ phải 1> <cao độ tđ phải 2> ....

NHƯ THẾ tiện lợi cho lập công thức, cũng như dễ hiệu chỉnh và thêm điểm đo mới vào HƠN hẳn là bạn để thế kia rất khó xử lý

Tuy nhiên góp ý vậy thui, nhưng đôi khi chúng ta lại phụ thuộc vào số liệu cung cấp từ địa hình



-----------
Chương trình chạy rất tốt rồi. Em thực sự cám ơn các anh, các bạn. Tiện ích nhỏ này mang lại tiện ích rất lớn cho mình. Nếu tự bản thân em thì đó là điều không thể mơ tới. Hiện tại em đang ở Hà Nội, nếu được xin cảm ơn các anh, các bạn bằng một chầu cafe tại hà nội vào thời gian tùy ý các anh. Nếu các anh, các bạn có thời gian cho mình xin được gặp gỡ (ĐT 0979898636)

Oh, thế thì phải thêm cặp vé máy bay nữa bác SA mới uống cafe được
 
Lần chỉnh sửa cuối:
Thực vậy, em đang dùng land desktop .Nhưng số liệu khảo sát cấp lên ở đạng TOPO (có đuôi .ntd) số liệu này muốn thiết kế được chuyển qua dang của Land, với các phiên bản 3.0 về trước thì sau khi chuyển số liệu là ổn, nhưng với số liệu của các bản 3.5 trở lên hay số liệu đã được mở bằng nova bản cao hơn 4.0 thì khi gi lại nó bị đảo không thể chuyển sang dạng đúng của land nữa, muốn thiết kế em phải chỉnh thủ công lại như vậy đó. (Anh thử xem chỉnh lại cho em cao đọ sang tương đối như em viết ở #17 và chuyển thêm ô lý trình sang nữa anh nhé, ở trong maco anh viết chưa chuyển qua. Em gửi các anh file em đã thực hiện bằng mã của anh viết)
Anh xem lại giúp cho em một điểm nữa là ô ở cột bên cạnh giá trị "0" ở cột A có giá trị bất kỳ (đó là cao độ tự nhiên của một điểm. không nhất thiết là >400.
Hii hơi tham quá !!!
 

File đính kèm

Lần chỉnh sửa cuối:
Thực vậy, em đang dùng land desktop .Nhưng số liệu khảo sát cấp lên ở đạng TOPO (có đuôi .ntd) số liệu này muốn thiết kế được chuyển qua dang của Land, với các phiên bản 3.0 về trước thì sau khi chuyển số liệu là ổn, nhưng với số liệu của các bản 3.5 trở lên hay số liệu đã được mở bằng nova bản cao hơn 4.0 thì khi gi lại nó bị đảo không thể chuyển sang dạng đúng của land nữa, muốn thiết kế em phải chỉnh thủ công lại như vậy đó. (Anh thử xem chỉnh lại cho em cao đọ sang tương đối như em viết ở #17 và chuyển thêm ô lý trình sang nữa anh nhé, ở trong maco anh viết chưa chuyển qua. Em gửi các anh file em đã thực hiện bằng mã của anh viết) Hii hơi tham quá !!!

Oh, thế này bạn phải phiền bác SA_... tiếp nữa thôi,
Mong Bác SA_DQ giúp bạn tiếp..
 
Cái anh chàng (Hổ)^2 này vẽ chuyện ra rồi đá banh cho người khác, Thật tệ ghê!

Oh, thế này bạn phải phiền bác SA_... tiếp nữa thôi, Mong Bác SA_DQ giúp bạn tiếp..

Bạn Hừu Thành sửa tự ên nha, dòng lệnh có đánh số đó. Bạn thêm vô bản gốc 2 dòng này;
Đáng lý chỉ thêm dòng 9 mà thôi; nhưng nhìn dữ liệu của bạn thấy quá nhiều, thêm dòng 4 vô, để màn hình khỏi 'lắc lư cái đầu, là lắc lư cái đầu. . ."

PHP:
Option Explicit
Const GiaTri As Double = 400
Sub CopyFor0()
 Dim lRow As Long, jJ As Long, RowB As Long, Row0 As Long
 Dim Rng As Range
 
 Sheets("S1").Select:               lRow = [a65432].End(xlUp).Row + 1
4 Application.ScreenUpdating = False
 For jJ = 2 To lRow
    With Cells(jJ, 1)
        If Not IsNumeric(.Value) Then
            .Resize(1, 2).Copy Destination:=.Offset(, 6)
            
9            If UCase$(.Value) = "S" Then .Offset(-1, 7) = .Offset(-1)
            
            If Row0 = 0 Then
                RowB = .Row + 1
            Else
                Set Rng = Range("A" & RowB & ":A" & (.Row - 1))
                GPE_com Rng, Row0:              Row0 = 0
            End If
        End If
        If .Value = 0 And .Offset(, 1) > GiaTri Then
            Row0 = .Row:            .Resize(1, 2).Copy Destination:=.Offset(, 6)
        End If
    End With
 Next jJ
End Sub
 
SA_DQ đã viết:
Bạn Hừu Thành sửa tự ên nha, dòng lệnh có đánh số đó. Bạn thêm vô bản gốc 2 dòng này;
Đáng lý chỉ thêm dòng 9 mà thôi; nhưng nhìn dữ liệu của bạn thấy quá nhiều, thêm dòng 4 vô, để màn hình khỏi 'lắc lư cái đầu, là lắc lư cái đầu. . ."
oh, hình như chưa ý với tác giả bác SA ơi,

Ý TÁC GIẢ LÀ THẾ NÀY:
HuuThanh đã viết:
(Trong bài em gửi em cũng mô tả nhầm là tương đối so với tim. Nhưng chính xác phải là chênh cao tương đối so với cọc trước nó. Cái này mong các anh hết sức thông cảm, nếu được nhờ các anh chỉnh lại cho em là tương đối so với cọc trước nó giúp em. Có nghĩa là kết quả cao độ tại vị trí bên trái (hay bên phải) đầu tiên lấy cao độ tuyệt đối của vị trí có giá trị 0 (cọc tim) cộng với chính nó, vị trí kế tiếp lấy chính nó cộng với giá trị tuyệt đối vừa tính được ở cọc ngay trước nó).

VD
S EG
-1.40 -0.05
-1.35 -0.02
0.00 578.36
1.19 0.01
1.58 -0.01
E
(bê trái)
+ Tại cọc cạnh cọc tim là: 578.36+(-0.02)=578.34
+ Tại cọc kế tiếp là: 578.34+(-0.05)=578.29
(bên phải)
+ Tại cọc đầu tiên: 578.36+0.01=578.37
+ Tại cọc thứ 2: 578.37+(-0.01)=578.36
vậy nhờ anh chỉnh lại trong công thức giúp em với!
 
Sửa lại 1 chút cho đúng ý tác giả

Đã thêm phần của Bác SA sửa tên
Sửa lại 1 chút cho đúng ý tác giả nhờ_BÁC SA kiểm tra hộ lại, tigertiger có ghi chú trong file - chỉ sửa hàm GPECOM

PHP:
Sub GPE_com(Clls As Range, VTri0 As Long)
 Dim mRow As Long, Zz As Long, RowM As Long
 Dim GTri0 As Double:               Dim Rng As Range, Rng9 As Range
 
 GTri0 = Range("B" & VTri0):        mRow = Clls.Cells(1, 1).Row
 RowM = mRow + Clls.Rows.Count - 1
 Set Rng9 = Range("A" & (VTri0 + 1) & ":A" & RowM)
 For Each Rng In Rng9
    With Rng
        .Offset(, 6) = .Value + .Offset(-1, 6)
        '.Offset(, 7) = GTri0 + .Offset(, 1)
        .Offset(, 7) = .Offset(-1, 7) + .Offset(, 1)
    End With
 Next Rng
 For Zz = (VTri0 - 1) To mRow Step -1
    With Cells(Zz, 1)
        .Offset(, 6) = .Value + .Offset(1, 6)
        '.Offset(, 7) = GTri0 + .Offset(, 1)  sua dong CODE nay thand code duoi
        .Offset(, 7) = .Offset(1, 7) + .Offset(, 1)
    End With
 Next Zz
End Sub
 

File đính kèm

Lại nhờ các anh chỉ giúp thêm em chút nữa !!!

Em cám ơn các anh !!!
- Số liệu em đã chuyển qua được, Xin các anh chỉ giúp thêm em mọt chút nữa.
- Nhưng giá trị ở cột B trên cùng dòng với cột có giá trị "0" ở cột A khi em cho giá trị nhỏ hơn 400 thì khi thực hiện nó không chuyển số liệu qua (giá trj này có thể nhận giá trị bất kỳ-nó là cao độ tự nhiên của một điểm). Vậy em phải chỉnh lại một chút ở chỗ nào vậy? Em đinh chỉnh lại một chút tại dòng "Const GiaTri As Double = 400" nhưng lai sợ nó ảnh hưởn tới chương trình nên chưa dám tự ý.
Xin cảm ơn các anh đã dành cho em thời gian và tình cảm thật nhiều !!!
 

File đính kèm

Lần chỉnh sửa cuối:
Cũng xin mong các anh thông cảm nhiều nhiều, kiến thức của những thành viên mới như em thì ít, cho nên khi lên diễn đàn không giúp được nhiều cho các bạn khác, mà chỉ nhờ các anh ,các bạn khác giải thích, giúp đỡ. Biết như vậy là mình ích kỷ và kém cỏi lắm. Rất mong các anh không chê trách em. Em sẽ cố học tập để không phụ lòng các thành viên đã ưu ái giúp đỡ.
 
Xin các anh chỉ giúp thêm em mọt chút nữa.
- Nhưng giá trị ở cột B trên cùng dòng với cột có giá trị "0" ở cột A khi em cho giá trị nhỏ hơn 400 thì khi thực hiện nó không chuyển số liệu qua (giá trj này có thể nhận giá trị bất kỳ-nó là cao độ tự nhiên của một điểm). Vậy em phải chỉnh lại một chút ở chỗ nào vậy? Em đinh chỉnh lại một chút tại dòng "Const GiaTri As Double = 400" nhưng lai sợ nó ảnh hưởn tới chương trình nên chưa dám tự ý.
Mình đã nói ở #18 rồi mà!
Bạn phải cho biết các giá trị thực địa vế cao độ tự nhiên này; Nó ba động trong khoảng nào;
Nếu nó có thể nhỏ hơn độ lệnh tại cột 'B' khi cột 'A' tương ứng bằng 0 thì chúng ta phải tìm cách khác, thích hợp hơn.
Trước mắt, giá trị 400 đó có thể giảm, nhưng phải lớn mà ta vừa nói. :-=
 
Em xin lỗi mà không đọc chưa kỹ bài #18, cao độ đó là cao độ tự nhiên của một điểm nó nằm trong khoảng 50-4000(m). Em đã sửa lại cho giá trị trong máy là 1 em thấy nó cũng chạy ra. kết quả thấy vẫn đúng, không biết khi thay đổi như thế nó có anh hưởng gì đến chương trình hay không?
 
Em xin lỗi mà không đọc chưa kỹ bài #18, cao độ đó là cao độ tự nhiên của một điểm nó nằm trong khoảng 50-4000(m). Em đã sửa lại cho giá trị trong máy là 1 em thấy nó cũng chạy ra. kết quả thấy vẫn đúng, không biết khi thay đổi như thế nó có anh hưởng gì đến chương trình hay không?

bạn đọc kỹ bài của bác SA để biết lý do nhé

Chúc thành công

---
SA_DQ đã viết:
Cái anh chàng (Hổ)^2 này vẽ chuyện ra rồi đá banh cho người khác, Thật tệ ghê!

Vì chỉ có bác mới sửa code của mình nhanh nhất

Sorry bác - em đã chuộc lỗi rùi nhé bằng các bài post hum nay (nhân đây xin cảm ơn bác SA - hẹn tái ngộ bác một ngày gần)
 
Lần chỉnh sửa cuối:
Em xin lỗi mà không đọc chưa kỹ bài #18, cao độ đó là cao độ tự nhiên của một điểm nó nằm trong khoảng 50-4000(m). Em đã sửa lại cho giá trị trong máy là 1 em thấy nó cũng chạy ra. kết quả thấy vẫn đúng, không biết khi thay đổi như thế nó có anh hưởng gì đến chương trình hay không?
Nếu ta có khoảng cao độ từ 50:4.000(m) thì lúc đó ta gán Const này là 49;
GiaTri này được đưa ra để tránh việc chép những giá trị 0 khác tại cột 'A' , nhưng không phải biều thị vị trí cao độ, mà chỉ là độ lệnh gì đó mà thôi
Xem lại hình mình đã đưa lên, để cùng nhau nhau đề ra hướng giải quyết. Việc này chỉ có thể giải quyết triệt để, một khi biết quy luật giá trị tại 'B' (cùng dòng) với cột 'A', một khi chúng bằng 0.

Còn vấn đề chỉ chép đến cột 'G' thay vì cột 'H' thì sửa lại câu lệnh số 9 mới thêm vô;

9 If UCase$(.Value) = "S" Then .Offset(-1, 7) = .Offset(-1)

Thay số 7 thành số 6 & chạy lại xem sao (Tất nhiên xóa những giá trị cũ tại cột 'H' đi)
 
Còn vấn đề chỉ chép đến cột 'G' thay vì cột 'H' thì sửa lại câu lệnh số 9 mới thêm vô;

9 If UCase$(.Value) = "S" Then .Offset(-1, 7) = .Offset(-1)

Thay số 7 thành số 6 & chạy lại xem sao (Tất nhiên xóa những giá trị cũ tại cột 'H' đi)

Oh, vấn đề tigertiger đã sửa rùi bác SA ah,


Nếu ta có khoảng cao độ từ 50:4.000(m) thì lúc đó ta gán Const này là 49;
GiaTri này được đưa ra để tránh việc chép những giá trị 0 khác tại cột 'A' , nhưng không phải biều thị vị trí cao độ, mà chỉ là độ lệnh gì đó mà thôi
Xem lại hình mình đã đưa lên, để cùng nhau nhau đề ra hướng giải quyết. Việc này chỉ có thể giải quyết triệt để, một khi biết quy luật giá trị tại 'B' (cùng dòng) với cột 'A', một khi chúng bằng 0.

Vì cột A thể hiện khoảng cách -> tại 1 mặt cắt chỉ có thể có 1 số 0 thui bác ah -- HY VỌNG cái này HuuThanh xác nhận rõ

Tuy nhiên nhìn lại MC ở khoảng dòng 93 thì đúng là nhiều số không thiệt -> đây có thể là rãnh nước thẳng đứng chăng??? (nếu đúng thế thì không sử dụng được file ở post #29 đâu nhé - vì thế sẽ sai)
Thế thì nên có thể đặt giá trị này =8 hoặc =10 sao cho cao hơn chiều chênh theo MIA (thước đo bên trắc đạc địa hình)
==> TUY nhiên khi đó mà đo ở đồng bằng (vd ĐB Sông Cửu Long) cao độ đôi khi còn -1, -2 hoặc chỉ vào khoảng 1.0 --4.0
VẬY có thể nên để người sd nhập có khi hay hơn
NHƯNG vẫn có thể còn vấn đề vì là so sánh lớn hơn ( > ) => có thể ng dùng cũng k quyết được khi mà các mức chênh lại có giá trị lớn hơn cả cao độ,
.
 
Lần chỉnh sửa cuối:
Vâng !!! Anh tigertiger ! nói đúng ạ, tại cột A trên cung một mặt cắt có thể có hơn 2 vị trí có giá trị 0 vì tất cả các điểm đó là cự ly tương đối mà cứ thay đổi cao độ là ta có cự ly tương đối. ví dụ khi đo một mặt cắt có vị trí rãnh hay mương ta thường có cặp những giá sau:
1 2
0 -0.2 (tại đúng điểm mép địa hình thấp xuống 0.2m)
0.4 0 (0.4m bằng phẳng)
0 0.2 (lên cao 0.2m)
....
như vậy cùng với giá trị 0 ở tim thì việc trên một mặt cắt có tới 3 giá trị 0 là bình thường.

* Sau khi đọc kỹ lại các bài em thấy ý tưởng của anh DA_DQ thật tuyệt vời vì anh cho test luôn giá trị ở cột B vì giá trị ở cột B là chên cao thường không lớn lắm. Do vậy việc gán một giá trị hằng số để so sánh trong bài là ý tưởng thậy hay (thực tình em cũng không thể nghĩ ra).

* Đến giờ thì em thấy đoạn code các anh, các bạn giúp đỡ đã thực hiện một các rất tốt. Có lẽ anh tigertiger cũng làm ngành công trình thì phải?

Em xin chân thành cảm ơn các anh, các bạn !!!
 
Tuy nhiên nhìn lại MC ở khoảng dòng 93 thì đúng là nhiều số không thiệt -> đây có thể là rãnh nước thẳng đứng chăng??? (nếu đúng thế thì không sử dụng được file ở post #29 đâu nhé - vì thế sẽ sai)
Điều này mình đã cảnh báo với AnhTuan1066 sau 5 h chiều qua rồi mà!
Thế thì nên có thể đặt giá trị này =8 hoặc =10 sao cho cao hơn chiều chênh theo MIA (thước đo bên trắc đạc địa hình)
==> TUY nhiên khi đó mà đo ở đồng bằng (vd ĐB Sông Cửu Long) cao độ đôi khi còn -1, -2 hoặc chỉ vào khoảng 1.0 --4.0 ; VẬY có thể nên để người sd nhập có khi hay hơn
NHƯNG vẫn có thể còn vấn đề vì là so sánh lớn hơn ( > ) => có thể ng dùng cũng k quyết được khi mà các mức chênh lại có giá trị lớn hơn cả cao độ.
Lúc đó, chắc khi nhập phải dùng màu sắc, hay cái gì đó để phân biệt mà thôi! - Giữa các số 0 trong chuỗi kích thước đo đạt được;
Vậy Hữu Thành cho biết xem nên sao chổ này?!!
 
Không sao! trong trường hợp cao độ tuyệt đối của khu vực khảo sát, đo đạc qua nhỏ, ta thường giả định cao độ của khu vực đó được nâng lên 100->200m. Như vậy địa hình sẽ được nâng lên, thực hiện như vậy trong ngành gt vẫn thực hiện ( như khi ta đo một khu vực nào đó không có các điểm mốc quốc gia, ta vẫn tiến hành giả định) trường hợp không cho phép giả định thì bắt buộc khi tiến hành xây dựng dữ liệu về điểm tim ta phải bổ sung thêm một mã gì đó cho phép chương trình nhận ra.
- Thực tình khi gủi bài nhờ các anh giúp em cũng không lường trước được các trường hợp như vậy, vì em công tác tại các tỉnh Tây Bắc cao độ tuyệt đối ở đây thường cao hơn 100m. Thứ 2 là trong quá trình các anh hướng dẫn kiến thức về VBA của em còn ít lên không được linh hoạt cho lắm. Nhũng vấn đề mà các anh đề cập thực tình em cũng không thể lường trước được ( ví dụ như trường hợp có nhiều hơn 1 số 0 trong một mặt cắt) nhưng các anh đã rất có kinh nghiệm và tính trước luôn cho em (thực sự bái phục) Chỉ sau khi kiểm tra lại em mới thấy rằng trong số liệu của mình có nhiều hơn 2 số 0.
Em hiện nay đang công tác trong lĩnh vực giao thông, không biết các anh có cùng nghành không vậy? Được gặp gỡ và được các anh giúp đỡ thực sự là một may mắn của em. Hi vọng rằng anh em mình sẽ được gặp nhau nhiều trên diễn đàn. Được gặp trực tiếp các anh e là khó vì em thì ở ngoài bắc xa qua !!!
Chương trình các anh hướng dẫn chậy rất tốt và trên cả mức mong đợi của em rồi. Thực ra ban đầu em cũng không thể nghĩ được nó lại giải quyết một cách gọ gàng như vậy đâu.
Chân thành cảm ơn các anh, các bạn đã nhiệt tình giúp đỡ !!!
 
Trích:
Tuy nhiên nhìn lại MC ở khoảng dòng 93 thì đúng là nhiều số không thiệt -> đây có thể là rãnh nước thẳng đứng chăng??? (nếu đúng thế thì không sử dụng được file ở post #29 đâu nhé - vì thế sẽ sai)
Điều này mình đã cảnh báo với AnhTuan1066 sau 5 h chiều qua rồi mà!

Lỗi tại TigerTiger cứ chủ quan nghĩ là bác SA phòng xa - vì thường số liệu địa hình ít xảy ra trường hợp này (m/c tự nhiên đâu mấy khi thẳng đứng - ở đây chắc là tài liệu hoàn công đây - đường đã thi công xong?) - cám ơn bác SA...


Lúc đó, chắc khi nhập phải dùng màu sắc, hay cái gì đó để phân biệt mà thôi! - Giữa các số 0 trong chuỗi kích thước đo đạt được;
Vậy Hữu Thành cho biết xem nên sao chổ này?!!
Đúng vậy bác SA_DQ ah,

Nhưng phân biệt màu sắc chi cho mệt, nếu xét thì nên: có chỉ trường hợp nào có nhiều hơn 1 số không (0) thì số 0 nào ứng với TIM - thì tương ứng với nó Ô ở cột C có giá trị là 1 chẳng hạn (NHƯNG hơi bất tiện là tác giả phải nhập vào và rà soát các m/c)

Ah, HuuThanh xem tại sao trong chương trình trắc đạc (họ xuất ra cho bạn) chắc hẳn phải phân biệt TIM chứ -> có thể còn số liệu nào khác k nhỉ, ví như 1 số quy ước chỉ ra vị trí tim (như số khoảng cách tính từ lề trái đến TIM chẳng hạn - 1 số phần mềm cũng căn vào điều này)?????

Túm lại:

có thể giải pháp thế này - giá trị đó (giá trị 400 xét đó) cần thay đổi thì xin hỏi: HuuThanh muốn là:
+ vào code sửa
+ hay là nhập vào từ một ô (gần nút copy to đó chẳng hạn)
+ hay là CT xuất hiện hộp thoại hỏi mỗi lần bấm vào copy to
???????????

HuuThanh Suy nghĩ và trả lời nhanh nhé....
 
Lần chỉnh sửa cuối:
CODE mà các anh cung cấp là ổn rồi. Thường cao đọ tuyệt đối khu vực em thực hiện không nhỏ hơn 100 do vậy em đã thay số 400 trong khai báo hằng bằng 50 là chương trình chạy tốt và chính xác. Không cần phải chỉnh lại gì cả. Nếu các anh có cái emai cho em thì tốt quá, có gì em liên lạc cùng các anh !!!
Cho em xin hỏi anh viết chữ trên nền hồng có khung làm thế nào đó? cả việc lồng anh vào đó nữa?
Em thấy các anh trình bày đẹp và dễ coi quá !!!
 
Không sao! trong trường hợp cao độ tuyệt đối của khu vực khảo sát, đo đạc qua nhỏ, ta thường giả định cao độ của khu vực đó được nâng lên 100->200m. Như vậy địa hình sẽ được nâng lên, thực hiện như vậy trong ngành gt vẫn thực hiện ( như khi ta đo một khu vực nào đó không có các điểm mốc quốc gia, ta vẫn tiến hành giả định) trường hợp không cho phép giả định thì bắt buộc khi tiến hành xây dựng dữ liệu về điểm tim ta phải bổ sung thêm một mã gì đó cho phép chương trình nhận ra.
- Thực tình khi gủi bài nhờ các anh giúp em cũng không lường trước được các trường hợp như vậy, vì em công tác tại các tỉnh Tây Bắc cao độ tuyệt đối ở đây thường cao hơn 100m. Thứ 2 là trong quá trình các anh hướng dẫn kiến thức về VBA của em còn ít lên không được linh hoạt cho lắm. Nhũng vấn đề mà các anh đề cập thực tình em cũng không thể lường trước được ( ví dụ như trường hợp có nhiều hơn 1 số 0 trong một mặt cắt) nhưng các anh đã rất có kinh nghiệm và tính trước luôn cho em (thực sự bái phục) Chỉ sau khi kiểm tra lại em mới thấy rằng trong số liệu của mình có nhiều hơn 2 số 0.

Thế thì yên tâm rùi, bạn down file cuối này (kèm trong bài này) - tigertiger đã bổ sung những thay đổi cũng như chỉnh lại giá trị là 40 thôi
PHP:
Const GiaTri As Double = 40
BẠN cập nhập lại nhé - biết chỗ sửa, biết phạm vi ứng dụng của CT là OK (VBA mã mở mà - yên tâm k phải hộp đen)

Chúc thành công

------------------
Cho em xin hỏi anh viết chữ trên nền hồng có khung làm thế nào đó? cả việc lồng anh vào đó nữa?
Em thấy các anh trình bày đẹp và dễ coi quá !!!
Cảm ơn

Muốn trích dẫn lại bài nào bạn bấm vào nút trích dẫn ở cuối bài đó, Muốn hiểu nữa thế thì bạn xem link sau để tìm hiểu thêm cách post bài (trong đó có nói về hình ảnh): http://www.giaiphapexcel.com/forum/showthread.php?t=250
.
 

File đính kèm

Lần chỉnh sửa cuối:
Nhờ các anh MOD xóa giúp em bài này !!!
 
Lần chỉnh sửa cuối:
Nhờ các anh MOD xóa giúp em bài này !!!
 
Lần chỉnh sửa cuối:
Cảm ơn các anh nhều !!!. Thực tình em rất vui, và hạnh phúc.

Oh, bạn đừng viết thế này -> vì như thế là SPAM bài đó - các MOD sẽ xóa những bài này (xóa cũng vất lém) - cả bài này của tui cũng sẽ xóa

Muốn cám ơn ai, bạn bấm vào nút cảm ơn là đủ, Nếu cần nữa thì bạn có thể nhắn tin (pm) cám ơn cho người đó

thế nhé rút Kinh nghiệm

NHỜ MODs, SMODs, AMINs XÓA HỘ BÀI NÀY NHÉ, Thanks


 
Lần chỉnh sửa cuối:

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

Back
Top Bottom