Hỏi bị lỗi khi kết nối dữ liệu từ accsess sang excel!! (1 người xem)

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

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

nad582

Thành viên thường trực
Tham gia
7/6/11
Bài viết
317
Được thích
48
Chào các anh chị trong GPE! em có 2 file: file Excel va Accsess.
em có đoạn code: Từ file excel kết nối với Accsess:
.....
Private Sub CommandButton1_Click()
Dim cnn As Object, lrs As Object
Dim mySQL As String, strFile As String
On Error GoTo Handle
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
strFile = Application.GetOpenFilename("FileAccess,*.mdb")
ActiveSheet.Unprotect ("362312293")
If Len(strFile) Then
cnn.Open "Provider=Microsoft.JET.OLEDB.4.0;" & _
"Data Source=" & strFile

'1
Range("6:65000").Delete Shift:=xlUp


'2
mySQL = "SELECT Story, AreaObj, AreaType, OutputCase, StepType, M11, M22, V13, V23 " & _
"FROM [Area Element Forces] " & _
"Where left(AreaObj,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[A6].CopyFromRecordset lrs
End With
lrs.Close
'3
mySQL = "SELECT Story&Area, Section " & _
"FROM [Area Assignments Summary] " & _
"Where left(line,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[K6].CopyFromRecordset lrs
End With
lrs.Close

'4
mySQL = "SELECT MembThick*100 " & _
"FROM [Area Assignments Summary] T1 " & _
"INNER JOIN [Sell Section Properties] T2 " & _
"ON T1.Section = T2.Section " & _
"Where left(line,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[M6].CopyFromRecordset lrs
End With
lrs.Close

'5
mySQL = "SELECT CentroidX, CentroidY " & _
"FROM [Area Assignments Summary] " & _
"Where left(line,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[N6].CopyFromRecordset lrs
End With

lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End If
Handle:
End
End Sub
.....

Nhưng nó chỉ thực hiện được '1 và '2 còn '3 , '4 và '5 thì chưa được xin các anh chị chỉ giúp dùm em.
- ở '3 là lấy field "story", field "Area", field "Section" ở tables "Area Assignments Summary" vào ô K6 với field "story" và field "Area" nằm chung 1 cột.
- ở '4 là lấy field "MembThick" ứng field "Section" ở tables "Sell Section Properties" với field "Section" ở tables "Area Assignments Summary" thì kết quả ở ô M6.
- ở '5 là lấy field "CentroidX" và field "CentroidY" ở tables "Area Assignments Summary" vào ô N6.
ví dụ:
ở '3: ô L6 = S100 thì ô M6 = 100
Nếu trong quá trình diễn giải có chỗ nào chưa rõ xin anh chị hồi đáp em trình bày rõ hơn..
chân thành cảm ơn...
 
Bạn xóa bớt dữ liệu rồi post lên xem thử nhé. File bạn đưa lên "khủng" quá...
 
Upvote 0
Bạn lấy tên các trường trong bảng [Area Assignments Summary] không đúng. Bảng [Area Assignments Summary] không có trường tên là Section mà chỉ có SectionType, không trường Line mà tôi "đoán" đó là Area
Ví dụ tại truy vấn số 3 của bạn sửa là
Mã:
             mySQL = "SELECT Story&Area, SectionType " & _
                            "FROM [Area Assignments Summary] " & _
                            "Where Area like 'F%'"

Các phần khác tôi cũng không biết bạn muốn lấy trường nào nên không đoán được. Bạn nghiên cứu tiếp nhé.
 
Upvote 0
Bạn lấy tên các trường trong bảng [Area Assignments Summary] không đúng. Bảng [Area Assignments Summary] không có trường tên là Section mà chỉ có SectionType, không trường Line mà tôi "đoán" đó là Area
Ví dụ tại truy vấn số 3 của bạn sửa là
Mã:
             mySQL = "SELECT Story&Area, SectionType " & _
                            "FROM [Area Assignments Summary] " & _
                            "Where Area like 'F%'"

Các phần khác tôi cũng không biết bạn muốn lấy trường nào nên không đoán được. Bạn nghiên cứu tiếp nhé.
có TRường "Section" mà, nhưng tại sao ko lấy được chứ, các anh chị giúp dùm....
View attachment 114114
 
Upvote 0
có TRường "Section" mà, nhưng tại sao ko lấy được chứ, các anh chị giúp dùm....
View attachment 114114
Tôi nhầm, và đã Test lại. Kết quả thật bất ngờ khi với tên trường là Section thì Excel báo lỗi trong khi Access không báo lỗi. Tôi đã test với kết nối tới riêng file Excel cũng có kết quả tương tự. Khi đổi tên trường khác Section thì cho kết quả ngay.

Không biết có phải đây là một trong những điểm hạn chế của Excel giống như việc không cho đặt tên sheet là History hay không. Chắc phải nhờ đến các cao thủ khác trả lời.
 
Upvote 0
có TRường "Section" mà, nhưng tại sao ko lấy được chứ, các anh chị giúp dùm....

Mình không biết trương Hs là gì mình không thấy trong cơ sở dữ liệu mdb nên mình chỉnh lại vậy ở đoạn code số 3 vậy
[GPECODE=vb]
mySQL = "SELECT [Area],[Section],[Perimeter],[CentroidX],[CentroidY]" & _
" FROM [Area Assignments Summary] " & _
" Where left(Area,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[K6].CopyFromRecordset lrs
End With
lrs.Close
[/GPECODE]
Còn đoạn code 4,5 tất cả điều bị lỗi hết nhưng không biết bạn lấy bảng nào trường nào nên không sửa được
 
Upvote 0
Một phát hiện nữa: Đối với trường có tên là Section nếu đưa vào ngoặc vuông thì lại Ok. Truy vấn số 3 sẽ là
Mã:
             mySQL = "SELECT Story&Area, [Section] " & _
                            "FROM [Area Assignments Summary] " & _
                            "Where Area like 'F%'"

dhn46 không hiểu tại sao để Section thì lỗi mà [Section] lại ok. Nhân topic này mong các anh chị giải đáp thắc mắc trên.
 
Upvote 0
dhn46 không hiểu tại sao để Section thì lỗi mà [Section] lại ok. Nhân topic này mong các anh chị giải đáp thắc mắc trên.

Thật sự nếu viết chuẩn tốt nhất chúng ta đều nên đưa vào dấu [] theo nguyên tắc thì chỉ tên trường có khoảng trắng mới đưa vào dấu ngoặc vuông [], nhưng tốt nhất là đưa vào [] hết. Thân
 
Upvote 0
Thật sự nếu viết chuẩn tốt nhất chúng ta đều nên đưa vào dấu [] theo nguyên tắc thì chỉ tên trường có khoảng trắng mới đưa vào dấu ngoặc vuông [], nhưng tốt nhất là đưa vào [] hết. Thân
Cảm ơn bạn nmhung49,

Vấn đề ở đây dhn46 đang thắc mắc là tại sao khi đưa vào dầu [] thì Section không lỗi nhưng đưa ra khỏi dấu [] thì Section lỗi? Các trường tên khác như Section1 hay Section2... đều không gây lỗi. (Và tất nhiên khi tên trường có khoảng trắng thì sẽ phải dùng [] rồi nên không xét đến)
 
Upvote 0
Cảm ơn bạn nmhung49,

Vấn đề ở đây dhn46 đang thắc mắc là tại sao khi đưa vào dầu [] thì Section không lỗi nhưng đưa ra khỏi dấu [] thì Section lỗi? Các trường tên khác như Section1 hay Section2... đều không gây lỗi. (Và tất nhiên khi tên trường có khoảng trắng thì sẽ phải dùng [] rồi nên không xét đến)
Có khi nào Section là một từ khóa trong Access nên bạn để vậy nó mới gây lỗi???
Thật sự nếu viết chuẩn tốt nhất chúng ta đều nên đưa vào dấu [] theo nguyên tắc thì chỉ tên trường có khoảng trắng mới đưa vào dấu ngoặc vuông [], nhưng tốt nhất là đưa vào [] hết.
Tên trường chứa khoảng trắng hoặc các ký tự đặc biệt thì chúng ta phải đưa nó vào cặp dấu []
 
Upvote 0
Mình không biết trương Hs là gì mình không thấy trong cơ sở dữ liệu mdb nên mình chỉnh lại vậy ở đoạn code số 3 vậy
[GPECODE=vb]
mySQL = "SELECT [Area],[Section],[Perimeter],[CentroidX],[CentroidY]" & _
" FROM [Area Assignments Summary] " & _
" Where left(Area,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[K6].CopyFromRecordset lrs
End With
lrs.Close
[/GPECODE]
Còn đoạn code 4,5 tất cả điều bị lỗi hết nhưng không biết bạn lấy bảng nào trường nào nên không sửa được
Xin anh giúp dùm em đoạn số 4 luôn, nó Hs là kết quả dò tìm (giống như vlookup, hlookup,..vậy đó), có nghĩa là:
- Tại
tables "Sell Section Properties": ở trường
"Section" có dữ liệu và ở trường
"MembThick" cũng có dữ liệu (thì trường
"MembThick" chính là Hs).(1)
View attachment 114115
- tại
tables "Area Assignments Summary": ở trường
"Section" có dữ liệu.(2)
View attachment 114116
Như vậy; tại
tables "Sell Section Properties", ở trường
"Section" có những dữ liệu giống với
trường
"Section"
tại
tables "Sell Section Properties".Từ (1) và (2), kết luận: từ
tables "Area Assignments Summary", ở trường
"Section" dò tìm (tìm kiếm) đến
tables "Sell Section Properties", ở trường
"Section" lấy kết quả Hs là
trường
"MembThick".
View attachment 114117
xin anh giúp cho, chân thành cảm ơn..
 
Upvote 0
Kinh nghiệm chung khi làm việc với CSDL LH:

Khi dùng SQL (hầu hết các phiên bản SQL), người ta tránh đăt những tên trường có ý nghĩa thông dụng, vd year, month, hoặc có ý nghĩa cơ cấu, vd schema, function, ...

Nếu lỡ phải gặp những tên này thì luôn luôn đóng chúng giữa hai dấu ngoặc vuông.

Nếu dùng ADO thì đóng tên trong ngoặc vuông là thói quen tốt - không thiệt hại gì mà luôn bảo đảm không bị lỗi chạm tên bất ngờ.
 
Upvote 0
các anh chị trong diễn dàn giúp em ở bài #13 với, em đợi mấy ngày rồi mà vẫn không có hồi đáp, xin anh chị giúp đỡ dùm...
chân thành cảm ơn....
 
Upvote 0
các anh chị trong diễn dàn giúp em ở bài #13 với, em đợi mấy ngày rồi mà vẫn không có hồi đáp, xin anh chị giúp đỡ dùm...
chân thành cảm ơn....
Bạn chép đoạn code này vào nhen

[GPECODE=vb]
Private Sub CommandButton1_Click()
Dim cnn As Object, lrs As Object
Dim mySQL As String, strFile As String
'On Error GoTo Handle
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
strFile = Application.GetOpenFilename("FileAccess,*.mdb")
ActiveSheet.Unprotect ("362312293")
If Len(strFile) Then
cnn.Open "Provider=Microsoft.JET.OLEDB.4.0;" & _
"Data Source=" & strFile

'1
Range("6:65000").Delete Shift:=xlUp



'2
mySQL = "SELECT Story, AreaObj, AreaType, OutputCase, StepType, M11, M22, V13, V23 " & _
"FROM [Area Element Forces] " & _
"Where left(AreaObj,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[A6].CopyFromRecordset lrs
End With
lrs.Close
'3
mySQL = "SELECT [Story]&[Area],[Section]" & _
" FROM [Area Assignments Summary] " & _
" Where left(Area,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[K6].CopyFromRecordset lrs
End With
lrs.Close


'4
mySQL = "SELECT MembThick*1000 " & _
" FROM [Area Assignments Summary] T1, [Shell Section Properties] T2" & _
" WHERE T1.[Section] = T2.[Section] "
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[M6].CopyFromRecordset lrs
End With
lrs.Close
'
'5
mySQL = "SELECT CentroidX, CentroidY " & _
"FROM [Area Assignments Summary] " & _
"Where left(Area,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[N6].CopyFromRecordset lrs
End With

lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End If
Handle:


End Sub


[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chép đoạn code này vào nhen

[GPECODE=vb]
Private Sub CommandButton1_Click()
Dim cnn As Object, lrs As Object
Dim mySQL As String, strFile As String
'On Error GoTo Handle
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
strFile = Application.GetOpenFilename("FileAccess,*.mdb")
ActiveSheet.Unprotect ("362312293")
If Len(strFile) Then
cnn.Open "Provider=Microsoft.JET.OLEDB.4.0;" & _
"Data Source=" & strFile

'1
Range("6:65000").Delete Shift:=xlUp



'2
mySQL = "SELECT Story, AreaObj, AreaType, OutputCase, StepType, M11, M22, V13, V23 " & _
"FROM [Area Element Forces] " & _
"Where left(AreaObj,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[A6].CopyFromRecordset lrs
End With
lrs.Close
'3
mySQL = "SELECT [Story]&[Area],[Section]" & _
" FROM [Area Assignments Summary] "

lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[K6].CopyFromRecordset lrs
End With
lrs.Close


'4
mySQL = "SELECT SELECT [Shell Section Properties].[MembThick]" & _
" FROM [Area Assignments Summary], [Shell Section Properties]" & _
" WHERE ([Area Assignments Summary].[Section] = [Shell Section Properties].[Section])"
mySQL = "SELECT MembThick*1000 " & _
" FROM [Area Assignments Summary] T1, [Shell Section Properties] T2" & _
" WHERE T1.[Section] = T2.[Section] "

lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[M6].CopyFromRecordset lrs
End With
lrs.Close
'
'5
mySQL = "SELECT CentroidX, CentroidY " & _
"FROM [Area Assignments Summary] "

lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[N6].CopyFromRecordset lrs
End With

lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End If
Handle:
End Sub
[/GPECODE]
Cảm ơn anh, em chép vào rồi!! đúng là lấy được Hs, nhưng tại sao nó dò không đúng, em thấy nó ko sai nhưng mak nó lại dò không đúng a xem rồi sửa lại giúp em với...

View attachment 114231

cảm ơn anh nhiều!!
 
Upvote 0
Cảm ơn anh, em chép vào rồi!! đúng là lấy được Hs, nhưng tại sao nó dò không đúng, em thấy nó ko sai nhưng mak nó lại dò không đúng a xem rồi sửa lại giúp em với...
cảm ơn anh nhiều!!

Ặc...ặc...chắc tại do trải qua nhiều công đoạn quá chơi 1 đoạn duy nhất luôn xem sao

[GPECODE=vb]
Private Sub CommandButton1_Click()
Dim cnn As Object, lrs As Object
Dim mySQL As String, strFile As String


Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
strFile = Application.GetOpenFilename("FileAccess,*.mdb")
ActiveSheet.Unprotect ("362312293")
If Len(strFile) Then
cnn.Open "Provider=Microsoft.JET.OLEDB.4.0;" & _
"Data Source=" & strFile

'1
Range("6:65000").Delete Shift:=xlUp



'2
mySQL = "SELECT Story, AreaObj, AreaType, OutputCase, StepType, M11, M22, V13, V23 " & _
"FROM [Area Element Forces] " & _
"Where left(AreaObj,1) like 'F'"
lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[A6].CopyFromRecordset lrs
End With
lrs.Close


'3
mySQL = "SELECT [Story] & [Area],T1.[Section],T2.[MembThick]*1000, T1.[CentroidX], T1.[CentroidY]" & _
" FROM [Area Assignments Summary] T1, [Shell Section Properties] T2" & _
" WHERE T1.[Section] = T2.[Section] and left([Area],1) like 'F'" & _
" ORDER BY [Story] & [Area];"


lrs.Open mySQL, cnn, 3, 1
With Sheet1
.[K6].CopyFromRecordset lrs
End With
lrs.Close

End If




End Sub


[/GPECODE]
 
Upvote 0
Chả biết bạn muốn dò cái gì, và tại sao lại không đúng.
Chỉ thấy là các câu truy vấn của bạn đâu có xếp theo thứ tự gì cả. Cho nên nếu bạn muốn nó sắp ngay dòng với nhau thì không được.

=== post trễ một chút, đấy là câu trả lời cho #16. Trước khi có câu #17. Nếu muốn sắp ngay nhau thì phải JOIN như câu #17 mới đúng ===
 
Lần chỉnh sửa cuối:
Upvote 0
Chả biết bạn muốn dò cái gì, và tại sao lại không đúng.
Chỉ thấy là các câu truy vấn của bạn đâu có xếp theo thứ tự gì cả. Cho nên nếu bạn muốn nó sắp ngay dòng với nhau thì không được.
Thật sự nhìn hình mà đoán thôi bạn VetMini chứ không hiểu bạn í muốn làm gì nữa đúng thì tốt sai thì làm lại hi...hi...
 
Upvote 0
Lưu ý chút xíu:

mệnh đề
left([Area],1) like 'F'
không sai nhưng không ai làm vậy cả.

1:
left([Area],1) = 'F'
(trường hợp đã lấy ký tự đầu tiên rồi thì chỉ dùng like khi muốn chọn 1 trong nhiều ký tự: left([Area],1) like '[FGH]'

2:
[Area] like 'F*'
(nếu là access thì *, nếu là TSQL thì %)
 
Upvote 0

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

Back
Top Bottom