2011-09-10 7 views
0

Excel 통합 문서간에 데이터를 가져 오거나 내보내는 데 문제가 있습니다. 예를 들어 3 개의 텍스트 상자가있는 양식이 있습니다.Visual Basic에서 TextBox 텍스트 유지

셀 A1, A2 및 A3이 완료된 간단한 Excel 시트를 설치했습니다. 디버그를 실행하면 처음 두 개의 상자에만 Excel 데이터가 채워집니다.

또한 텍스트 상자의 값을 변경하면 원래 스프레드 시트에 다시 저장되지 않습니다! 저장이 발생했는지 확인하기 위해 스프레드 시트를 열려고 할 때 읽기 전용 알림이 표시되지만 응용 프로그램 시작시 새 데이터를 가져올 수 있도록 원래 시트를 변경할 수 있기를 원합니다!

아래 코드를 붙여 넣었습니다 ... 나는 심각하게 잘못된 것을하고 있습니까?

Public Class Form1 

    Dim objExcel As New Excel.Application 
    Dim objWorkbook As Excel.Workbook 
    Dim objWorksheet As Excel.Worksheet 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     objWorkbook = objExcel.Workbooks.Open("C:\Users\HP\desktop\Book2.xls") 
     objWorksheet = CType(objWorkbook.Worksheets.Item("Sheet1"), Excel.Worksheet) 
     TextBox1.Text = objWorksheet.Cells(1, 1).text 
     TextBox2.Text = objWorksheet.Cells(2, 1).text 
     TextBox3.Text = objWorksheet.Cells(3, 1).text 
    End Sub 

    Private Sub Command1_Click() 
     objWorksheet.Cells(1, 1).Value = TextBox1.Text 
     objWorksheet.Cells(2, 3).Value = TextBox2.Text 
     objWorksheet.Cells(3, 3).Value = TextBox3.Text 
    End Sub 

    Private Sub Command2_Click() 
     objExcel.Application.Quit() 
    End Sub 

    Private Sub Command3_Click() 
     objExcel.SaveAs("C:\Users\HP\desktop\Book2.xls") 
    End Sub 
End Class 
+0

위의 코드가 컴파일 되었습니까? 그냥이 줄을 봐야합니다. TextBox3.Text = objWorksheet.celss (3, 1) .text –

+0

감사합니다. Mattias, txtbox 3을 채우지 못하게하는 것으로 눈치 채지 못했던 오타였습니다. 왜 내가 다시 쓰는 것처럼 보이지 않는지에 대한 아이디어와 셀 내용을 변경하기 위해 원래 스프레드 시트를 다시 열어 볼 수 있습니까? 모든 질문에 대해 유감스럽게 생각합니다. 저는 VB에 익숙하지 않습니다. 여전히 내 길을 찾고 있습니다. 다시 한 번 감사드립니다 H – Hazeley

+0

Excel.Workbook을 사용하기 위해 어떤 라이브러리를 가져 오나요? –

답변

0

textbox3을 설정하는 라인은 미스 (1 3) 시도

는 .text이 코드를 사용하여 코드를 대체 할 TextBox3.Text = objWorksheet.celss을 입력합니다. 이전 파일이 여전히 잠겨 있기 때문에 여전히 fileprotection에 불만이 있다면 새 파일에서 시도하십시오. 공공 Form1 클래스

Dim objExcel As New Excel.Application 
Dim objWorkbook As Excel.Workbook 
Dim objWorksheet As Excel.Worksheet 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    objWorkbook = objExcel.Workbooks.Open("C:\Temp\Bok3.xlsx") 

    objWorksheet = objWorkbook.Worksheets.Item("Sheet1") 

    TextBox1.Text = objWorksheet.Cells(1, 1).text 
    TextBox2.Text = objWorksheet.Cells(2, 1).text 
    TextBox3.Text = objWorksheet.Cells(3, 1).text 
    objExcel.Workbooks.Close() 
    objExcel.Application.Quit() 

End Sub 

Private Sub Command1() 
    objWorkbook = objExcel.Workbooks.Open("C:\Temp\Bok3.xlsx") 

    objWorksheet = objWorkbook.Worksheets.Item("Sheet1") 


    objWorksheet.Cells(1, 1).Value = TextBox1.Text 
    objWorksheet.Cells(2, 1).Value = TextBox2.Text 
    objWorksheet.Cells(3, 1).Value = TextBox3.Text 

    objWorkbook.Save() 
    objExcel.Workbooks.Close() 
    objExcel.Application.Quit() 

End Sub 
End Class 
+0

나는 행운을 두려워했습니다.새로운 오류 메시지는 이제 새로운 인터페이스 (라인 3)로 사용할 수 없다는 메시지가 나타났습니다 또한 응용 프로그램은 이제 엑셀 통합 문서에서 전혀 값을 반환하지 않습니다. 나는 내 원래의 질문에있는 코드를 수정하여 당신의 도움을 다시 한번 감사드립니다 H – Hazeley

+0

나는 내 대답을 업데이트하고 코드를 직접 시험해 보았습니다. 그래서 도움이되기를 바랍니다. –

+0

고마워 Mattias .... 나는 아직도 여기에서 완전한 손실에 아직도 두려워한다. 응용 프로그램에서 데이터를 읽는 중입니다.하지만 엑셀 시트의 파일 경로가 'objWorkbook = objExcel.Workbooks.Open ("C : \ Users \ Public \ Book2.xls") 줄에 포함되는 즉시 어떤 이유로 인해 파일 자동으로 읽기 전용이됩니다. 내가 checke dthe 파일 속성을 가지고 있으며, 그래서 그들은 정말로 무슨 일이 일어나고 있는지 모르겠다 읽기 전용으로 설정되지 않습니다? 각기 다른 지정으로 두 번씩 새 파일을 만들었지 만 같은 일이 계속 발생합니다. 도와 주셔서 정말 고마워요. 정말 고마워요. H – Hazeley

0

는 따라서 Excel 파일을 잠금 해제, 프로세스를 종료하는 표준 API 호출을 사용하는 것을 시도했다.

System.Runtime.InteropServices.Marshal.ReleaseComObject(objComObject)을 사용하는 경우 프로그램이 닫힐 때까지 프로세스가 여전히 남아있는 것처럼 보입니다.이 프로세스는 Excel 프로세스가 종료되고 "읽기 전용"이 아닌 상태에서 파일을 열 수 있습니다. 저장 및 quiting 후, 프로세스는 종료됩니다 PostMessage를

PostMessage(objExcel.Hwnd, WM_QUIT, 0, 0) 

를 호출하여 잠금을 해제, 당신의 코드에서

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, _ 
ByVal wParam As Int32, ByVal lParam As Int32) As Int32 
    Const WM_QUIT = &H12 

: 여기

는 그것을 할 수있는 방법입니다. 나는이 문제를 전에 가지고 있었고 인터넷 상에 온통 미친 양의 물건이있다. ReleaseComObject의 일부 버전은 작동하지만 XP 이후 버전에서는 작동하는 것으로 보이며 XP 버전에서는 제대로 작동하지 않는 것 같습니다. 톤을 이해하지 못했지만 작동하는 것으로 보이는 유일한 것은이 PostMessage 선언입니다.

행운을 빕니다 ... 당신은 거기 밖에있는 유일한 사람이 아닙니다. Bing에서 "excel.application process release"를 검색하면 당신이 찾은 것에 놀랄 것입니다 !!!

0

통합 문서 대신 워크 시트를 저장하면 정상적으로 작동하는 것 같습니다. 여기서는 현재 워크 시트 만 저장해야한다고 가정합니다.

Public Class Form1 

Dim objExcel As New Excel.Application 
Dim objWorksheet As Excel.Worksheet 
Dim objWorkbook As Excel.Workbook 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    objWorkbook = objExcel.Workbooks.Open("C:\Users\HP\desktop\Book2.xls") 

    objWorksheet = CType(objWorkbook.Worksheets.Item("Sheet1"), Excel.Worksheet) 

    TextBox1.Text = objWorksheet.Cells(1, 1).text 
    TextBox2.Text = objWorksheet.Cells(2, 1).text 
    TextBox3.Text = objWorksheet.Cells(3, 1).text 
End Sub 

Private Sub Command1_Click() Handles Button1.Click 

    objWorksheet.Cells(1, 3).Value = TextBox1.Text 
    objWorksheet.Cells(2, 3).Value = TextBox2.Text 
    objWorksheet.Cells(3, 3).Value = TextBox3.Text 

    objWorksheet.SaveAs("C:\Users\HP\desktop\Book2.xls") 
    objExcel.Workbooks.Close() 
    objExcel.Application.Quit() 

End Sub 

End Class 
관련 문제