Xin sửa giúp và giải thích

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

Cu_lan

Thành viên mới
Tham gia
16/3/17
Bài viết
4
Được thích
0
Giới tính
Nữ
Nghề nghiệp
ラヴィS2 501号
Mình mới dân lần mò vào viết code để xử dụng macro
mình có đoạn code sau, không rõ là tại sao không thể chạy được
xin mọi người chỉ giáo và sửa lại code cho mình được không
Sub Repalce_Data() 'copy and paste data from CSV file to a sheets of thisWorkbook'
Dim wk As Worksheet, Org_Sheet As Worksheet
Dim ind_column As Integer, m As Integer

Application.ScreenUpdating = False
Application.DisplayAlerts = False '確認メッセージは表示されなくなります。

Set wk = ActiveWorkbook.Sheets("Run_Program")
Set Org_Sheet = ThisWorkbook.Sheets("Org_sheet_1")
With wk
If .Range("E2") = "" Then
MsgBox "copy new file ......!", vbOKOnly + vbInformation, "Information"
Exit Sub
Else
For ind_column = 5 To 10
Org_Sheet.Range("B8").Value2 = .Range("L5").Value ' 最大回数データ取り込む’
'Range(Cells(5, ind_column)).Value.Copy
Org_Sheet.Range("B10").Value2 = .Range(Cells(5, ind_column)).Value '運転回数データ取り込む’
Org_Sheet.Range("B12").Value2 = .Range(Cells(2, ind_column)).Value '加速時間データ取り込む'
Org_Sheet.Range("B14").Value2 = .Range(Cells(2, ind_column)).Value '減速時間データ取り込む'
Org_Sheet.Range("B16").Value2 = .Range(Cells(3, ind_column)).Value '定常時間データ取り込む'
Org_Sheet.Range("B18").Value2 = .Range(Cells(4, ind_column)).Value '停止時間データ取り込む'

.Range(Cells(32, ind_column), Cells(33, ind_column)).Value = Org_Sheet.Range("F54:F55").Value
.Range(Cells(42, ind_column), Cells(43, ind_column)).Value = Org_Sheet.Range("F64:F65").Value
Next
End If
End With

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub
 

File đính kèm

mình có đoạn code sau, không rõ là tại sao không thể chạy được
xin mọi người chỉ giáo
vd.
Mã:
Org_Sheet.Range("B10").Value2 = .Range(Cells(5, ind_column)).Value
Cells(5, ind_column) sẽ trả về 1 giá trị. Trong trường hợp này trả về vd. giá trị số 85. Tức thành
Mã:
Org_Sheet.Range("B10").Value2 = .Range(85).Value
Rõ ràng .Range(85) là sai cú pháp.
Help
Excel Developer Reference
Worksheet.Range Property
Returns a Range object that represents a cell or a range of cells.
Syntax

expression.Range(Cell1, Cell2)

expression A variable that represents a Worksheet object.

Parameters

Name Required/Optional Data Type Description
Cell1 Required Variant The name of the range. This must be an A1-style reference in the language of the macro. It can include the range operator (a colon), the intersection operator (a space), or the union operator (a comma). It can also include dollar signs, but they’re ignored. You can use a local defined name in any part of the range. If you use a name, the name is assumed to be in the language of the macro.
Cell2 Optional Variant The cell in the upper-left and lower-right corner of the range. Can be a Range object that contains a single cell, an entire column, or entire row, or it can be a string that names a single cell in the language of the macro.
và sửa lại code cho mình được không
Nếu thế thì hãy giải thích, code phải làm những gì cụ thể - lấy gì từ đâu cộng với cái gì từ đâu, xào lại như thế nào, tăng lực ra sao - để đi đến kết quả cuối cùng.

Đừng bắt người khác phải phân tích code của mình để đoán ý của mình. "Đừng bắt" vì 2 lý do:
1. Không lý gì người khác phải phân tích, đoán mò trong khi mình có thể tự nói ra.
2. Không phải ai cũng có hứng.
--------------
Thôi thì rỗi hơi đoán mò thử.

Có thể không phải là .Range(Cells(5, ind_column)).Value mà là .Cells(5, ind_column).Value

Tức bây giờ là
Mã:
For ind_column = 5 To 10
                    Org_Sheet.Range("B8").Value2 = .Range("L5").Value    ' (A)
                    Org_Sheet.Range("B10").Value2 = .Cells(5, ind_column).Value    ' (B)
...

Nhưng lôgíc có vấn đề.
(A): .Range("L5").Value là một giá trị cụ thể không phụ thuộc vào biến điều khiển ind_column, ô cụ thể Org_Sheet.Range("B8") cũng vậy. Vậy tại sao lại đặt Org_Sheet.Range("B8").Value2 = .Range("L5").Value trong vòng lặp? Làm 6 lần một việc lẽ ra chỉ cần làm 1 lần?

(B): Org_Sheet.Range("B10") là ô cố định, không phụ thuộc vào biến điều khiển ind_column. Code nhập vào 1 ô nhất định lần lượt 6 giá trị? Nếu thế thì chỉ cần làm 1 lần: nhập vào ô đó giá trị thứ 6. Thế thôi.

Trên cơ sở code chỉ đoán mò được thế thôi. Chả biết tại sao người ta lại dùng vòng lặp cho 2 dòng ví dụ trên.
 
Diễn đàn này không chấp nhận tiêu đề như vầy của bạn:
" Xin sửa giúp và giải thích " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . //..,,
 
Mình mới dân lần mò vào viết code để xử dụng macro
mình có đoạn code sau, không rõ là tại sao không thể chạy được
xin mọi người chỉ giáo và sửa lại code cho mình được không
Sub Repalce_Data() 'copy and paste data from CSV file to a sheets of thisWorkbook'
.........................................
.........................................
End Sub
Bạn là thành viên mới, trước khi viết bài nên đọc kỹ nội quy để tránh vi phạm, đọc lại nội quy ở Link sau (để hiểu rõ):
https://www.giaiphapexcel.com/diendan/threads/nội-quy-diễn-đàn-cập-nhật.76052/

Bạn vi phạm nội quy như sau:
1/ Đăng bài sai Box:
- Bài này đúng ra bạn phải đăng ở Box "Chuyên mục xử lý, gỡ rối code VBA", ở Link sau:
https://www.giaiphapexcel.com/diend...-lý-gỡ-rối-code-vba.85576/page-85#post-856397
- Hoặc đăng ở Box "Chuyên đề giải đáp những thắc mắc về code VBA", ở Link sau:
https://www.giaiphapexcel.com/diend...hắc-mắc-về-code-vba.83698/page-67#post-855545

2/ Tiêu đề của bạn vi phạm như sau:
-Vi phạm nội quy tại khoản 5, mục II. Quy định về Hình thức của bài viết.
-Vi phạm nội quy tại khoản 2, khoản 3, mục III. Quy định về tiêu đề bài viết.
 
vd.
Mã:
Org_Sheet.Range("B10").Value2 = .Range(Cells(5, ind_column)).Value
Cells(5, ind_column) sẽ trả về 1 giá trị. Trong trường hợp này trả về vd. giá trị số 85. Tức thành
Mã:
Org_Sheet.Range("B10").Value2 = .Range(85).Value
Rõ ràng .Range(85) là sai cú pháp.
Help


Nếu thế thì hãy giải thích, code phải làm những gì cụ thể - lấy gì từ đâu cộng với cái gì từ đâu, xào lại như thế nào, tăng lực ra sao - để đi đến kết quả cuối cùng.

Đừng bắt người khác phải phân tích code của mình để đoán ý của mình. "Đừng bắt" vì 2 lý do:
1. Không lý gì người khác phải phân tích, đoán mò trong khi mình có thể tự nói ra.
2. Không phải ai cũng có hứng.
--------------
Thôi thì rỗi hơi đoán mò thử.

Có thể không phải là .Range(Cells(5, ind_column)).Value mà là .Cells(5, ind_column).Value

Tức bây giờ là
Mã:
For ind_column = 5 To 10
                    Org_Sheet.Range("B8").Value2 = .Range("L5").Value    ' (A)
                    Org_Sheet.Range("B10").Value2 = .Cells(5, ind_column).Value    ' (B)
...

Nhưng lôgíc có vấn đề.
(A): .Range("L5").Value là một giá trị cụ thể không phụ thuộc vào biến điều khiển ind_column, ô cụ thể Org_Sheet.Range("B8") cũng vậy. Vậy tại sao lại đặt Org_Sheet.Range("B8").Value2 = .Range("L5").Value trong vòng lặp? Làm 6 lần một việc lẽ ra chỉ cần làm 1 lần?

(B): Org_Sheet.Range("B10") là ô cố định, không phụ thuộc vào biến điều khiển ind_column. Code nhập vào 1 ô nhất định lần lượt 6 giá trị? Nếu thế thì chỉ cần làm 1 lần: nhập vào ô đó giá trị thứ 6. Thế thôi.

Trên cơ sở code chỉ đoán mò được thế thôi. Chả biết tại sao người ta lại dùng vòng lặp cho 2 dòng ví dụ trên.

Cảm ơn " Batman1" rất nhiều! Nhờ có giải thích của bạn mà mình hiểu được rõ được vấn đề.
căn bản ở chỗ mình không hiểu rõ về "Range". dẫn đến viết sai cú pháp mà không biết tại sao.

Còn vấn đề vòng lặp thì
Org_Sheet.Range("B8").Value2 = .Range("L5").Value 'Nhap du lieu dau vao A’
For ind_column = 5 To 10
Org_Sheet.Range("B10") = .Cells(5, ind_column).Value2 'Nhap du lieu dau vao B’’
Org_Sheet.Range("B12") = .Cells(2, ind_column).Value2 'Nhap du lieu dau vao C’
Org_Sheet.Range("B14") = .Cells(2, ind_column).Value2 'Nhap du lieu dau vao D’

' Sau khi tinh toan tra ve ket qua tai, dong Org_Sheet("F54:F55") & Org_Sheet.Range("F64:F65")
' Voi moi lan thay doi ket qua theo bien ind_column thi copy sang o tuong ung voi bien thay doi

.Range(Cells(32, ind_column), Cells(33, ind_column)).Value = Org_Sheet.Range("F54:F55").Value
.Range(Cells(42, ind_column), Cells(43, ind_column)).Value = Org_Sheet.Range("F64:F65").Value
Next
Có lẽ lần đầu post bài, nên attach file vi phạm quy chế.
nên gây cho mọi người không hiểu ý mình muốn hỏi chỗ nào bị lỗi và muốn hỏi tại vị trí nào,
mình sẽ rút kinh nghiệm. rất cảm ơn bạn
 
Bạn vẫn chưa hiểu hết những gì tôi viết.
Mã:
For ind_column = 5 To 10
Org_Sheet.Range("B10") = .Cells(5, ind_column).Value2 'Nhap du lieu dau vao B’’
...
Tức lần lượt nhập vào Org_Sheet.Range("B10") lần lượt .Cells(5, 5).Value2, .Cells(5, 6).Value2, .Cells(5, 7).Value2, .Cells(5, 8).Value2, .Cells(5, 9).Value2, .Cells(5, 10).Value2

Nếu thế chả cần vòng lặp mà nhập luôn
Mã:
Org_Sheet.Range("B10") = .Cells(5, 10).Value2
Hay tôi bỏ sót chỗ nào chưa đọc?
 
Bạn vẫn chưa hiểu hết những gì tôi viết.
Mã:
For ind_column = 5 To 10
Org_Sheet.Range("B10") = .Cells(5, ind_column).Value2 'Nhap du lieu dau vao B’’
...
Tức lần lượt nhập vào Org_Sheet.Range("B10") lần lượt .Cells(5, 5).Value2, .Cells(5, 6).Value2, .Cells(5, 7).Value2, .Cells(5, 8).Value2, .Cells(5, 9).Value2, .Cells(5, 10).Value2

Nếu thế chả cần vòng lặp mà nhập luôn
Mã:
Org_Sheet.Range("B10") = .Cells(5, 10).Value2
Hay tôi bỏ sót chỗ nào chưa đọc?
Theo mình đoán 4 ô sau:
Org_Sheet.Range("F54:F55").Value
Org_Sheet.Range("F64:F65").Value
chứa công thức lệ thuộc vào các ô: Org_Sheet.Range("B10") , B12, B14, khi nằm trong vòng lặp và ind_column chạy thì kết quả thay đổi và gán vào vị trí cột khác nhau
.Range(Cells(32, ind_column), Cells(33, ind_column)).Value = Org_Sheet.Range("F54:F55").Value
.Range(Cells(42, ind_column), Cells(43, ind_column)).Value = Org_Sheet.Range("F64:F65").Value
Với các cột từ 5 đến 10 có kết quả khác nhau, không có vòng lặp thì 6 cột từ 5 tới 10 cùng 1 kết quả
 
Theo mình đoán 4 ô sau:
Org_Sheet.Range("F54:F55").Value
Org_Sheet.Range("F64:F65").Value
chứa công thức lệ thuộc vào các ô: Org_Sheet.Range("B10") , B12, B14, khi nằm trong vòng lặp và ind_column chạy thì kết quả thay đổi và gán vào vị trí cột khác nhau
.Range(Cells(32, ind_column), Cells(33, ind_column)).Value = Org_Sheet.Range("F54:F55").Value
.Range(Cells(42, ind_column), Cells(43, ind_column)).Value = Org_Sheet.Range("F64:F65").Value
Với các cột từ 5 đến 10 có kết quả khác nhau, không có vòng lặp thì 6 cột từ 5 tới 10 cùng 1 kết quả
Tôi chỉ nói tới dòng những này
Mã:
Org_Sheet.Range("B10").Value2 = .Range(Cells(5, ind_column)).Value
Org_Sheet.Range("B12").Value2 = .Range(Cells(2, ind_column)).Value
Org_Sheet.Range("B14").Value2 = .Range(Cells(2, ind_column)).Value
Org_Sheet.Range("B16").Value2 = .Range(Cells(3, ind_column)).Value
Org_Sheet.Range("B18").Value2 = .Range(Cells(4, ind_column)).Value

Còn trong những dòng này
Mã:
.Range(Cells(32, ind_column), Cells(33, ind_column)).Value = Org_Sheet.Range("F54:F55").Value
.Range(Cells(42, ind_column), Cells(43, ind_column)).Value = Org_Sheet.Range("F64:F65").Value

thì trong mỗi vòng lặp là nhập vào những ô (vùng) khác nhau chứ không phải nhập vào cùng một ô (vùng) như ở bên trên: vào E32:E33 và E42:E43, F32:F33 và F42:F43, G32:G33 và G42:G43, H32:H33 và H42:H43, I32:I33 và I42:I43, J32:J33 và J42:J43.

Ở trên (Org_Sheet.Range("B10").Value2 = .Range(Cells(5, ind_column)).Value ...) là nhập 6 giá trị vào cùng 1 ô nên tương đượng với nhập 1 lần nhưng nhập giá trị cuối cùng.

Có chỗ nào tôi nói phải bỏ hoàn toàn vòng lặp? Tôi chỉ nói là với những dòng tôi chỉ ra thì không phải dùng vòng lặp ***. Tức với chúng thì bỏ ra ngoài vòng lặp. Vd. tôi cũng đã đưa ra ở bài #6
Mã:
Org_Sheet.Range("B10") = .Cells(5, 10).Value2

***: Đấy là tôi phân tích trên cơ sở tập tin. Tập tin không có bất cứ công thức nào. Lời giải thích, mô tả cũng không có. Khác với mọi người tôi không thích chơi trò chơi đoán mò.

Nếu có công thức gì đó thì đưa ra. Lúc đó sẽ bàn sau. Hoặc cứ để code cũ, nhưng phải ý thức được hành động mình làm. Thế thôi.
 
Lần chỉnh sửa cuối:
!~` /(hông nên trả lời cho những bài đang sai nội 2ui! :nospam:
Đúng rồi đó, nên khắc khe đối với những thành viên vi phạm nội quy (đối với 2 vấn đề này).

- Tiêu đề: Xin sửa giúp và giải thích (về nội dung không có ý nghĩa gì cả).
- Đăng bài sai Box.

Tại sao phải khắt khe, vì mấy vấn đề sau:
1/ Trang Web Diễn đàn GPE được bố trí, sắp xếp theo từng Box với từng chuyên mục. Nếu bài Đăng sai Box thì nó sẽ sẽ thành một mớ hổn độn, khi các thành cần tìm đọc để học hỏi, tìm hiểu, tham khảo những thứ cần áp dụng trong công việc thì chắc tìm đỏ con mắt.
2/ Tiêu đề với từ khóa thế này "Xin sửa giúp và giải thích" làm sao tra Google để tìm những thứ cần (sẽ tìm thấy một mớ lộn xộn).
3/ Sau một vài tháng muốn đọc lại những bài viết của mình thì chẳng nhớ được nó nằm ở Box nào.

Như giải thích nêu trên, Ban quản trị nên đưa bài này vào thùng rác để lập lại trật tự cho Diễn đàn.
 
Tiêu đề bài này có thể dịch sang tiếng Việt từ câu này:
"copy and paste data from CSV file to a sheets of thisWorkbook "
 
Web KT

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

Back
Top Bottom