Chuyển đổi dữ liệu

Liên hệ QC

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

  • Chuyen so lieu.rar
    5.6 KB · Đọc: 86
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

  • GPE.COM.rar
    9.4 KB · Đọc: 42
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

  • GPE.COM.rar
    17.7 KB · Đọc: 41
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

  • Chuyensolieu_01.xls
    23 KB · Đọc: 24
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

  • Chuyensolieu_02.xls
    22 KB · Đọc: 19
Đâ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

  • ChuyenSoLieu_R.rar
    31.9 KB · Đọc: 22
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom