nhờ viết dùm code vòng lập lấy data từ ngày đến ngày

Liên hệ QC

ketoan113

Thành viên hoạt động
Tham gia
10/3/07
Bài viết
199
Được thích
30
kính gửi các anh chị
em có mày mò viết vba lấy data từ web cafef.vn về, file em nó như sau:

ô B3 = mã cp
ô F3 = ngày bắt đầu (trong code em ghi là ngaybd)
ô I3 = ngày kết thúc (trong code em nghi là ngaykt)

vd ngày hiện tại em gõ = 10/11/2022, code hiện tại của em sẽ lấy data là ngày bắt đầu (10/11/2022), sau đó copy data em cần sang paste vào sheet1

nhưng em cần lấy data từ ngày đến ngày ( từ ngày bắt đầu đến ngày kết thúc) em không viết viết code sao,

em nhờ anh chị giúp em xíu, viết dùm em code vòng lập với ạ

em cảm ơn các anh chị

p/s: anh anhtuan2939 có đọc được topic của em thì giúp em với nhé, tks a ạ
 

File đính kèm

  • Chi tiet giao dich CK - Copy.xlsm
    135.3 KB · Đọc: 37
Nếu dùng Query thì phải dùng cái này này. Có sẵn ví dụ ngon lành luôn.


Mấy cái lấy dữ liệu web thì cứ Python là tiện nhất.

Thực ra vụ lấy dữ liệu từ web thì vba cũng đẳng cấp lắm đó, xử lý vào file cũng đơn giản hơn việc dùng python
 
Upvote 0
Tôi reject cái báo cáo của bạn. Trong bài #34 tôi có ghi là "có khó chịu hay không", nghĩa là nếu bình thường tôi sẽ khó chịu khi bài viết được viết tắt kiển chat chit như ko, dc, ntn, ... hoặc chêm từ tiếng Anh như tks, hi, thank, ...
Chêm tiếng Anh là không lịch sự đối với người Việt, và viết tắt không định nghĩa trước thì người ta có quyền đoán nghĩa. Khi đoán nghĩa sai thì người hỏi bị thiệt thòi. Huống hồ kiểu chat chit là vi phạm nội quy.
kính gửi các bác

do em không biết nên vi phạm nên các bác thông cảm bỏ qua cho em ạ
em xin rút kinh nghiệm
Bài đã được tự động gộp:

Thực ra vụ lấy dữ liệu từ web thì vba cũng đẳng cấp lắm đó, xử lý vào file cũng đơn giản hơn việc dùng python
vba excel hay mà bác
hihi
Bài đã được tự động gộp:

Do cái web này :
+ Ngày không giao dịch nó vẫn ra cái header chỉ không có dữ liệu.
+ Ngày hiện tại (hôm nay) trước 9h sáng (giờ mở phiên) thì vẫn lấy kết quả của ngày trước đó.
Em cũng phải sửa đi sửa lại mấy lần.
đúng rồi bác
file của bác huhumalu giải quyết được các vấn đề đó ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy lại file. Sửa được lỗi khi ngày bắt đầu là ngày không giao dịch, chưa sửa được trường hợp ngày cuối. Có gì nếu nó báo lỗi chọn dư vài ngày
Cứ thử với mã công ty khác
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
 
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{List.Count(Source)-1}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplacePr = Table.ReplaceValue(ReplaceP,"Giá",null,Replacer.ReplaceValue,{"Giá"}),
    ReplaceTT = Table.ReplaceValue(ReplacePr,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
em thấy file này có vài điểm như sau ạ:
1. dùng cách của bác @ptm0412 cũng hay, dùng power query thì trong quá trình lấy data excel vẫn có thể làm việc khác

tuy nhiên em thấy lấy data có vẻ hơi chậm hơn file của bác @huhumalu

2. file của bác @huhumalu thì sửa được các lỗi em thấy phát sinh, file của bác @ptm0412 thì chưa sửa được lỗi trường hợp ngày cuối

em chân thành cảm ơn 2 bác @ptm0412, @huhumalu
 
Upvote 0
file của bác @ptm0412 thì chưa sửa được lỗi trường hợp ngày cuối
Được nọ thì mất kia: Sửa lỗi không có dữ liệu ngày đầu ngày cuối thì ngày lỗi lại không xuất hiện 1 dòng trống. Trang web này kỳ ở chỗ không có dữ liệu thì số cột và tên cột lại khác so với những ngày có dữ liệu.
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
    
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    SourceCheck = Table.AddColumn(SourceN,"Check", each if
    List.Count(Table.ColumnNames([Column1])) = 4 then 1 else 2),
    SourceFilter = Table.SelectColumns(Table.SelectRows(SourceCheck, each [Check] = 1),{"Column1"}),
    ColumnList = Table.ColumnNames(SourceFilter[Column1]{0}),
    Result =Table.ExpandTableColumn(SourceFilter,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplaceTT = Table.ReplaceValue(ReplaceP,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
 
Upvote 0
Được nọ thì mất kia: Sửa lỗi không có dữ liệu ngày đầu ngày cuối thì ngày lỗi lại không xuất hiện 1 dòng trống. Trang web này kỳ ở chỗ không có dữ liệu thì số cột và tên cột lại khác so với những ngày có dữ liệu.
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
   
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    SourceCheck = Table.AddColumn(SourceN,"Check", each if
    List.Count(Table.ColumnNames([Column1])) = 4 then 1 else 2),
    SourceFilter = Table.SelectColumns(Table.SelectRows(SourceCheck, each [Check] = 1),{"Column1"}),
    ColumnList = Table.ColumnNames(SourceFilter[Column1]{0}),
    Result =Table.ExpandTableColumn(SourceFilter,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplaceTT = Table.ReplaceValue(ReplaceP,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
bác @ptm0412 cho em hỏi cái code này bác viết để vào đâu để nó chạy vậy? em cảm ơn bác
 
Upvote 0
Nếu dùng code lấy dữ liệu từ web, chi bằng lấy bằng M-code của Power query.

PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
 
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{0}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceP,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}})

in
    DataType

Tôi cho rằng Power query lấy đủ dữ liệu hơn VBA code, lại còn có thể thêm cột ngày

View attachment 283367
kính gửi bác @ptm0412 , nhân tiện nói lấy data từ web bằng power query, em đang làm 1 file lấy data từ google sheet về excel nhưng đang vướng 1 số mong bác giúp em với ạ

1. đặt dữ liệu tại ô A6

2. trong lúc edit data lấy về, sao em không xoá được dòng 1 bác nhỉ (dòng 1 là column1, column2....), làm sao xoá được dòng 1 ạ?

3. data sẽ lấy theo mã cổ phiếu (trong file là ô B4), làm sao để link mã cổ phiếu tại 1 ô trên excel với google sheets bác nhỉ? code M-code bác viết cho power query em thấy bác làm được ạ

nếu được bác giải thích chi tiết dùm em thắc mắc em hỏi với ạ, tại vì em sẽ áp dụng cho các file khác ( em còn dự định làm nhiều file lấy data từ google sheet về excel nữa ạ)

bác coi file đính kèm dùm em ạ

em cảm ơn bác @ptm0412


link youtube em tham khảo:
Liên kết: https://www.youtube.com/watch?v=cF06J-yhhas
 

File đính kèm

  • Laydata_googlesheet.xlsm
    30 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
kính gửi bác @ptm0412 , nhân tiện nói lấy data từ web bằng power query, em đang làm 1 file lấy data từ google sheet về excel nhưng đang vướng 1 số mong bác giúp em với ạ
1. ô A6: Thì cứ chèn bên trên 5 dòng
2. Dùng hàm Table.Skip
3. Đặt 1 name là 1 ô chứa mã CP
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "MaCP"]}[Content][Column1]{0},
    Source = Excel.Workbook(Web.Contents("https://docs.google.com/spreadsheets/d/1ix3Fphw_qdIF6kEj3UYiIVemmkpGZpyRGkVWB_xw5tg/export?format=xlsx"), null, true),
    Source1 = Source{[Item="dinh gia cp",Kind="Sheet"]}[Data],
    Source2 = Table.PromoteHeaders(Table.Skip(Source1,3)),
    Types= Table.TransformColumnTypes(Source2,{{"Data Reportprice", type number}, {"Data Targetprice", type number}, {"Data Avgtargetprice", type number}, {"Target Discount 10%", type number}, {"Target Discount 15%", type number}, {"Target Discount 20%", type number}}),
    FilterCP = Table.SelectRows(Types, each ([Data Code] = MaCP))
in
    FilterCP
 
Upvote 0
1. ô A6: Thì cứ chèn bên trên 5 dòng
2. Dùng hàm Table.Skip
3. Đặt 1 name là 1 ô chứa mã CP
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "MaCP"]}[Content][Column1]{0},
    Source = Excel.Workbook(Web.Contents("https://docs.google.com/spreadsheets/d/1ix3Fphw_qdIF6kEj3UYiIVemmkpGZpyRGkVWB_xw5tg/export?format=xlsx"), null, true),
    Source1 = Source{[Item="dinh gia cp",Kind="Sheet"]}[Data],
    Source2 = Table.PromoteHeaders(Table.Skip(Source1,3)),
    Types= Table.TransformColumnTypes(Source2,{{"Data Reportprice", type number}, {"Data Targetprice", type number}, {"Data Avgtargetprice", type number}, {"Target Discount 10%", type number}, {"Target Discount 15%", type number}, {"Target Discount 20%", type number}}),
    FilterCP = Table.SelectRows(Types, each ([Data Code] = MaCP))
in
    FilterCP
code này để vào đâu, và code hoạt động sao vậy bác? em chưa biết , em cảm ơn bác

bị lỗi bác ơi @ptm0412

1668863421233.png
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy từ GG Sheet chi bằng lấy trực tiếp từ Web (vì GG Sheet lấy từ web, phải refresh 2 lần, lấy từ GG Sheet còn phải xóa bớt dòng thừa)
Các tùy chọn:
1. Chọn mã (ô C3), nếu bỏ trống lấy hết các mã
2. Chọn xem báo cáo từ ngày (ô E3): ngày của năm càng cũ thì càng nhiều dữ liệu
3. Chọn số dòng tối đa sẽ lấy (ô H3): Lấy hết mã, xem từ 01/01/2010 khoảng trên 6000 dòng, chỉ chọn 1 mã sẽ có khoảng dưới 100 hoặc 200 dòng

Không chọn mã để lấy hết (trên 6000 dòng)

1668879838658.png

Chọn 1 mã và 200 dòng

1668879756881.png

PHP:
let
        MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        ReportDate = Date.From(Excel.CurrentWorkbook(){[Name = "DReport"]}[Content][Column1]{0}),
        RowsData = Number.ToText(Excel.CurrentWorkbook(){[Name = "RowsData"]}[Content][Column1]{0}),
        Source = Json.Document(Web.Contents("https://finfo-api.vndirect.com.vn/v4/recommendations?" & (if
            MaCP <> null then "q=code:" & MaCP else "") & "~reportDate:gte:" & Date.ToText(ReportDate,"yyyy-MM-dd") & "&size=" & RowsData & "&sort=reportDate:ASC")),
    List1 = Record.ToTable(Source)[Value]{0},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", {"code", "firm", "type", "reportDate", "source", "analyst", "reportPrice", "targetPrice", "avgTargetPrice"}),
    Types = Table.TransformColumnTypes(Expanded,{{"reportDate", type date}, {"reportPrice", type number}, {"targetPrice", type number}, {"avgTargetPrice", type number}})
in
    Types
 

File đính kèm

  • DinhGiaCoPhieu.xlsx
    40.3 KB · Đọc: 9
Upvote 0
Lấy từ GG Sheet chi bằng lấy trực tiếp từ Web (vì GG Sheet lấy từ web, phải refresh 2 lần, lấy từ GG Sheet còn phải xóa bớt dòng thừa)
Các tùy chọn:
1. Chọn mã (ô C3), nếu bỏ trống lấy hết các mã
2. Chọn xem báo cáo từ ngày (ô E3): ngày của năm càng cũ thì càng nhiều dữ liệu
3. Chọn số dòng tối đa sẽ lấy (ô H3): Lấy hết mã, xem từ 01/01/2010 khoảng trên 6000 dòng, chỉ chọn 1 mã sẽ có khoảng dưới 100 hoặc 200 dòng

Không chọn mã để lấy hết (trên 6000 dòng)

View attachment 283614

Chọn 1 mã và 200 dòng

View attachment 283613

PHP:
let
        MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        ReportDate = Date.From(Excel.CurrentWorkbook(){[Name = "DReport"]}[Content][Column1]{0}),
        RowsData = Number.ToText(Excel.CurrentWorkbook(){[Name = "RowsData"]}[Content][Column1]{0}),
        Source = Json.Document(Web.Contents("https://finfo-api.vndirect.com.vn/v4/recommendations?" & (if
            MaCP <> null then "q=code:" & MaCP else "") & "~reportDate:gte:" & Date.ToText(ReportDate,"yyyy-MM-dd") & "&size=" & RowsData & "&sort=reportDate:ASC")),
    List1 = Record.ToTable(Source)[Value]{0},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", {"code", "firm", "type", "reportDate", "source", "analyst", "reportPrice", "targetPrice", "avgTargetPrice"}),
    Types = Table.TransformColumnTypes(Expanded,{{"reportDate", type date}, {"reportPrice", type number}, {"targetPrice", type number}, {"avgTargetPrice", type number}})
in
    Types
em cảm ơn bác @ptm0412, em xin trả lời thắc mắc của bác ạ

1.
tại vì em tay ngang, nghiệp dư nên em không biết cách lấy trực tiếp data từ web về excel ,nên em đi đường vòng mất thời gian là vậy ạ

2.
các tuỳ chọn trong file của bác giúp em : mục số 1 giữ lại, mục 2 và 3 bỏ đi dùm em được không ạ (có nhiêu lấy hết bấy nhiêu luôn cho khoẻ, chạy file không điền vào ô E3, H3 thì file báo lỗi ạ)

3.
chọn mã (ô C3) bác viết trong code dòng nào vậy? giải thích dùm em với ạ


Khi em lấy data từ web về có mấy dạng như sau ạ (do cấu trúc web có thể khác nhau):
(vì là tay ngang nên cách nào dễ thì em làm được, khó em đành bó tay nhờ trợ giúp ạ)

cách 1: record vba (data > from web), sau đó chỉnh sửa lại code theo ý của mình

cách 2: anh @Nguyễn Duy Tuân có video hướng dẫn lấy được data dạng id table nên em cũng học theo (cách này lấy nhanh hơn cách 1, khi lấy data dạng này thì excel vẫn làm việc khác được)

Liên kết: https://www.youtube.com/watch?v=OSfcpLGVLOk



cách 3. khi web em không lấy được dạng 1 và 2, em thấy trên mạng có lấy về được google sheets nên em học theo (web > google sheets > excel) nên em mới biết ít về google app script, power query

(các bác là chuyên gia thì vấn đề được giải quyết 1 cách dễ dàng, còn em thì tay ngang nên mày mò code lâu lắm, phải xem code ý nghĩa sao để áp dụng cho các file khác em làm về sau nữa ạ)
@huhumalu

Lỗi khi chạy file

1668899906246.png
 
Lần chỉnh sửa cuối:
Upvote 0
em cảm ơn bác @ptm0412, em xin trả lời thắc mắc của bác ạ
Muốn lấy hết thì E3 ghi 01/01/2000, H3 ghi 10000 (tôi thấy tối đa có 6000)
Các mã đều nằm trong code. Bạn mới biết ít thì học thêm sẽ biết nhiều. Tải tài liệu của tôi viết về đọc trong đó có nhiều các thủ thuật nhỏ nhỏ. Kể cả xóa dòng, lấy tiêu đề, lấy name trên sheet, ... Chứ cái clip bạn xem chỉ lấy được duy nhất 1 kiểu, được sao để vậy, cột dư không chỉ dẫn cách xóa, dòng dư không biết làm.
 
Upvote 0
Muốn lấy hết thì E3 ghi 01/01/2000, H3 ghi 10000 (tôi thấy tối đa có 6000)
Các mã đều nằm trong code. Bạn mới biết ít thì học thêm sẽ biết nhiều. Tải tài liệu của tôi viết về đọc trong đó có nhiều các thủ thuật nhỏ nhỏ. Kể cả xóa dòng, lấy tiêu đề, lấy name trên sheet, ... Chứ cái clip bạn xem chỉ lấy được duy nhất 1 kiểu, được sao để vậy, cột dư không chỉ dẫn cách xóa, dòng dư không biết làm.
dạ vâng em cảm ơn bác @ptm412

vì cách làm cũ em không làm được nên em mới tìm cách mới, và tìm thấy power query, em cảm ơn bác Phạm Thành Mỹ

nhân tiện em nhờ bác @ptm412 nếu bác có thời gian lấy dùm em data từ link fialda về excel ( em lấy được về ggsheets thôi ạ, về excel em bó tay, em nhờ nhiều quá em cũng ngại)

link json: https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=hpg

(3 kí tự cuối hpg là mã cổ phiếu, bác thiết kế dùm em 1 ô trên excel để em gõ vào các mã cổ phiếu nhé bác)

các thuật ngữ tài chính:

sale: doanh thu
profit: lợi nhuận
grossprofitmargin: biên lợi nhuận gộp
eps: lợi nhuận trên mỗi cổ phiếu
growth_yoy: tăng trưởng quý này so với quý trước

Link hiện trên web

1668941766514.png

Kết quả em lấy trên ggsheets

1668941925584.png

em cám ơn bác @ptm0412
 
Lần chỉnh sửa cuối:
Upvote 0
Gợi ý:
Đọc tài liệu Power query ở đây:
Xem thí dụ về lấy dữ liệu web nhiều trang, nhiều mã, ... có sử dụng name trên sheet làm tham số
 
Upvote 0
Gợi ý:
Đọc tài liệu Power query ở đây:
Xem thí dụ về lấy dữ liệu web nhiều trang, nhiều mã, ... có sử dụng name trên sheet làm tham số
đa tạ bác @ptm0412
chúc bác nhiều sức khoẻ, mọi việc tốt đẹp ạ
 
Upvote 0
Trong tài liệu phần lấy dữ liệu từ web có các nội dung cần lưu ý:
- Đặt name cho 1 ô, sau đó lấy giá trị của ô vào PQ
- Tách địa chỉ web thành 2 hoặc nhiều phần, trong đó có phần text tĩnh và phần động lấy giá trị của name. Nối lại ra địa chỉ động.
- Lấy tên cột từ List, expand list theo danh sách tên cột.
Tuy nhiên lấy dữ liệu từ json của web có hơi khác:
- Kết quả của json là 1 record
- Chuyển record thành table phải tìm dòng chứa list để lấy ra 1 list
- Chuyển list thành table, vẫn là các record
- Lấy tên cột từ Record (hàm Record.FieldNames, thay vì Table.ColumnNames)
- Expand record (dùng hàm Table.ExpandRecordColumn thay vì Table.ExpandTableColumns)

Code:
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        Source = Json.Document(Web.Contents("https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=" &  MaCP)),
    List1 = Record.ToTable(Source)[Value]{1},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    ColList = Record.FieldNames(Table1[Column1]{0}),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", List.FirstN(ColList,47)),
in
    Expanded

Do có 52 cột mà tôi chỉ muốn lấy 47 cột nên dùng thêm hàm List.FirstN
 

File đính kèm

  • GetWebDataJsonRecord.xlsx
    37.2 KB · Đọc: 9
Upvote 0
Trong tài liệu phần lấy dữ liệu từ web có các nội dung cần lưu ý:
- Đặt name cho 1 ô, sau đó lấy giá trị của ô vào PQ
- Tách địa chỉ web thành 2 hoặc nhiều phần, trong đó có phần text tĩnh và phần động lấy giá trị của name. Nối lại ra địa chỉ động.
- Lấy tên cột từ List, expand list theo danh sách tên cột.
Tuy nhiên lấy dữ liệu từ json của web có hơi khác:
- Kết quả của json là 1 record
- Chuyển record thành table phải tìm dòng chứa list để lấy ra 1 list
- Chuyển list thành table, vẫn là các record
- Lấy tên cột từ Record (hàm Record.FieldNames, thay vì Table.ColumnNames)
- Expand record (dùng hàm Table.ExpandRecordColumn thay vì Table.ExpandTableColumns)

Code:
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        Source = Json.Document(Web.Contents("https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=" &  MaCP)),
    List1 = Record.ToTable(Source)[Value]{1},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    ColList = Record.FieldNames(Table1[Column1]{0}),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", List.FirstN(ColList,47)),
in
    Expanded

Do có 52 cột mà tôi chỉ muốn lấy 47 cột nên dùng thêm hàm List.FirstN
em chân thành cảm ơn và đa tạ bác @ptm0412
Trong tài liệu phần lấy dữ liệu từ web có các nội dung cần lưu ý:
- Đặt name cho 1 ô, sau đó lấy giá trị của ô vào PQ
- Tách địa chỉ web thành 2 hoặc nhiều phần, trong đó có phần text tĩnh và phần động lấy giá trị của name. Nối lại ra địa chỉ động.
- Lấy tên cột từ List, expand list theo danh sách tên cột.
Tuy nhiên lấy dữ liệu từ json của web có hơi khác:
- Kết quả của json là 1 record
- Chuyển record thành table phải tìm dòng chứa list để lấy ra 1 list
- Chuyển list thành table, vẫn là các record
- Lấy tên cột từ Record (hàm Record.FieldNames, thay vì Table.ColumnNames)
- Expand record (dùng hàm Table.ExpandRecordColumn thay vì Table.ExpandTableColumns)

Code:
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        Source = Json.Document(Web.Contents("https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=" &  MaCP)),
    List1 = Record.ToTable(Source)[Value]{1},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    ColList = Record.FieldNames(Table1[Column1]{0}),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", List.FirstN(ColList,47)),
in
    Expanded

Do có 52 cột mà tôi chỉ muốn lấy 47 cột nên dùng thêm hàm List.FirstN
cảm ơn bác @ptm0412
em nhờ bác giúp em thêm:

1.
viết dùm em code khi thay đổi mã ở ô C2 của sheet Data, thì tự dộng refesh lấy dữ liệu luôn ạ ( gõ nhiều mã refesh nhiều lần mất thêm thời gian ạ).

2.
em có làm thểm cái pivot table và pivot chart bên sheet Chart, nếu được bác viết dùm em code khi gõ mã vào ô C2 của sheet Data thì sẽ tự động refesh bên pivot chart luôn.

bác xem file đính kèm nhé.

em cảm ơn bác.
 

File đính kèm

  • GetWebDataJsonRecord (1).xlsx
    75.1 KB · Đọc: 6
Upvote 0
em chân thành cảm ơn và đa tạ bác @ptm0412

cảm ơn bác @ptm0412
Cái Data Validation của tôi ở ô C2 bạn vất đi đâu rồi?
Code đặt tại Sheet Data:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C2")) Is Nothing Then ActiveWorkbook.Connections("Query - Data").Refresh
End Sub
Code đặt tại sheet Chart
PHP:
Private Sub Worksheet_Activate()
PivotTables(1).PivotCache.Refresh
End Sub
 
Upvote 0
Cái Data Validation của tôi ở ô C2 bạn vất đi đâu rồi?
Code đặt tại Sheet Data:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C2")) Is Nothing Then ActiveWorkbook.Connections("Query - Data").Refresh
End Sub
Code đặt tại sheet Chart
PHP:
Private Sub Worksheet_Activate()
PivotTables(1).PivotCache.Refresh
End Sub

Cái Data Validation của tôi ở ô C2 bạn vất đi đâu rồi?
em cám ơn bác @ptm0412 , cái Data Validation em clear đi rồi ạ

em đang làm cái power query nhưng đang bị lỗi, bác xem dùm em lỗi gì với ạ (bác xem file đính kèm nhé), cám ơn bác ptm

Link:

https://fiin-fundamental.ssi.com.vn/FinancialAnalysis/GetFinancialRatioV2?language=vi&Type=Company&OrganCode=HPG&Timeline=2022_1&Timeline=2022_2&Timeline=2022_3&Timeline=2021_4

Hình ảnh báo lỗi:

1669386388600.png
 

File đính kèm

  • DatafromWeb(SSI).xlsm
    26.8 KB · Đọc: 3
Upvote 0
Web KT

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

Back
Top Bottom