달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
반응형
728x90
반응형

 

 

엑셀 VBA 파일 읽기, 텍스트 파일 열기 예제; Excel Text File Read

 

엑셀 비베에서, 주어진 텍스트 파일의 내용을 읽어서 메시지박스에 출력하는 예제 소스입니다. 다음 예제에서는 "D:\Z\test.txt" 라는 경로에 있는 텍스트 파일을 읽는데, 이런 경로가 없다면 소스에서 경로(디렉토리;폴더)를 적절히 수정해 주어야 합니다. 물론 test.txt 라는 파일 속에 아무 내용이든 글자들이 들어 있어야 출력이 됩니다.

VBA매크로: 파일 내용 1줄씩 읽어 출력하기 소스


(엑셀에서 Alt+F11키를 눌러, 비베 에디터를 실행하고, 비베 에디터 메뉴의, "삽입 > 모듈"을 선택한 후, 다음 코드를 붙여 넣습니다.)
비베 에디터에서 F5 키를 누르거나, 엑셀에서 Alt+F8 키를 누르면 VBA 매크로가 실행됩니다.

Sub Text_File_Read()
  On Error GoTo errorMessage
  Dim s As String, s2 As String, fileHandle As Integer

  fileHandle = FreeFile ' 사용 가능한, 파일 핸들 번호 구하기
  Open "D:\Z\test.txt" For Input As fileHandle ' 파일 열기

  ' 텍스트 파일 한 줄씩 읽기 (한글 영문 모두 가능)
  Do While Not EOF(fileHandle) ' 파일의 끝까지 반복
    Line Input #fileHandle, s  ' 읽은 1줄을 변수 s 에 대입
    s2 = s2 & s & Chr(13)      ' 결과를 저장할 변수에 차곡차곡 추가
  Loop

  MsgBox s2 ' 대화상자에 파일 내용 출력


quitSub:
  Close fileHandle ' 위에서 연 파일만 닫기
  Exit Sub ' 이 Sub 프로시저를 종료


errorMessage:
  ' 에러 메시지 대화상자 출력
  MsgBox Err.Description, vbOKOnly + vbCritical, "에러 코드: " & Err.Number
  Resume quitSub

End Sub

 

원본출처:http://mwultong.blogspot.com/2007/08/vba-excel-text-file-read.html 


728x90
반응형
:
Posted by mapagilove
728x90
반응형

 

 

(엑셀ado)엑셀자료를 한꺼번에 DB에 저장하기

 

test_ado.zip

인터넷을 검색해보면 알겠지만, DB자료를 엑셀로 불러들이는 구문은 쉽게 접할 수 있습니다.

하지만 방대한 엑셀자료를 DB로  저장하는 구문은 그리 많지 않습니다.

 

첨부화일은 아주 간단한 그러면서도 구문을 조금만 분석하면 쉽게 응용할 수 있는 예제화일입니다.

미흡하지만 엑셀로 DB연동 프로그램을 작성하는 분에게 도움이 되길 바랍니다. 

 

Sub append_to_DB()
Dim adodbRecord As Object
Dim strConnect As String
Dim strSQL As String
Dim varAdddata As Variant, i As Long
    strConnect = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & _
      ThisWorkbook.Path & "\test_access.mdb"
    'strConnect = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & _
      "\\127.198.97.15\공유폴더\test_access.mdb"

    '서버접속인 경우
      
    strSQL = "SELECT Table1.* FROM Table1"
    Set adodbRecord = CreateObject("ADODB.Recordset")
    adodbRecord.Open strSQL, strConnect, 2, 3
    '이상 DB에 접속하는 전형적인 구문
    
    '엑셀자료를 DB에 집어넣습니다.
    varAdddata = Sheets("Sheet1").Range("A2:B" & Cells(65536, 1).End(xlUp).Row).Value
    With adodbRecord
      For i = 1 To UBound(varAdddata)
        .AddNew
        .Fields("name") = varAdddata(i, 1)
        .Fields("content") = varAdddata(i, 2)
      Next i
      .Update
    End With
   
    MsgBox "엑셀자료를 성공적으로 DB에 저장하였습니다.", vbInformation
End Sub


Sub from_DB()
Dim adodbRecord As Object
Dim strConnect As String
Dim strSQL As String
Dim varAdddata As Variant, i As Long
    Sheets("Sheet1").Range("F2:G65536").ClearContents
   
    strConnect = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & _
      ThisWorkbook.Path & "\test_access.mdb"
    strSQL = "SELECT Table1.* FROM Table1"
    Set adodbRecord = CreateObject("ADODB.Recordset")
    adodbRecord.Open strSQL, strConnect, 2, 3
   
    Sheets("Sheet1").Range("F2").CopyFromRecordset adodbRecord
   
    MsgBox "성공적으로 DB자료를 엑셀로 불러들였습니다.", vbInformation
End Sub

 

 

추가로 ADO에 관심이 있다면 아래 링크도 참고하시기 바랍니다.

http://blog.naver.com/atmyhome/90036541078

 

 

수정이력)

130108 엑셀2007이상 버전에서도 작동되도록 첨부파일을 수정하였습니다. 

728x90
반응형
:
Posted by mapagilove
2014. 11. 19. 11:40

mdb(ADO) 작성 방법 프로그래밍 엑셀VBA 이야기2014. 11. 19. 11:40

728x90
반응형

 

 

mdb(ADO) 작성 방법  프로그래밍

 

Excel로 작업한 Data를 Access로 변환하는 내용입니다.

 

1.  엑셀파일을  하나  생성합니다.
      -  파일명  :  C:\Book1.xls

 

2.  엑셀파일에  다음과  같이  데이타를  작성해  주십시요.


영어단어             뜻                값 
school              학교               1 
student             학생               2 
computer          컴퓨터            3 
visual  basic     비쥬얼베이직  4 

 

      -  엑셀파일  작성시  첫번째  Row  의  값을  MDB  에선  필드명으로  인식을  합니다.  그렇기  때문에 첫번째  Row  는  필드명으로  그리구  두번째  Row  부터  데이타를  입력해  주시기  바랍니다.

 

3.  엑셀파일이  작성되었으면  비쥬얼베이직에서  프로젝트를  하나  생성하고  기본폼위에  버튼  하나와 데이타컨트롤  하나를  생성합니다.
      -  버튼  :  Command1
          데이타컨트롤  :  Data1

 

4.  폼의  선언부에  다음의  함수와  버튼에  다음과  같이  코딩하시기  바랍니다.

 

Private  STR_MDB  As  String

Private  Function  CREATE_TABLE()  As  Integer
        Dim  tdExample  As  TableDef
        Dim  fld()  As  Field
        Dim  dbDatabase  As  Database
       
        Dim  strTable  As  String
       
        Dim  intCount  As  Integer
        Dim  i  As  Integer

        If  Dir(STR_MDB)  <>  ""  Then
                '  파일이  존재하면  삭제한다.
                Kill  STR_MDB
        End  If
       
        strTable  =  Mid(CStr(Data1.RecordSource),  1,  Len(CStrata1.RecordSource))  -  1)
       
        '  MDB  생성
        Set  dbDatabase  =  CreateDatabase(STR_MDB,  dbLangGeneral,  dbEncrypt)

 

        '  테이블  생성
        Set  tdExample  =  dbDatabase.CreateTableDef(strTable)

        intCount  =  Data1.Recordset.Fields.Count
        ReDim  fld(intCount  -  1)
       
        '  엑셀의  필드수만큼  필드  생성
        For  i  =  0  To  intCount  -  1
                Set  fld(i)  =  tdExample.CreateField(Data1.Recordset.Fields(i).Name,  _
                                    Data1.Recordset.Fields(i).Type,  _
                                    Data1.Recordset.Fields(i).Size)
                tdExample.Fields.Append  fld(i)
        Next
       
        dbDatabase.TableDefs.Append  tdExample
       
        '  필드수를  리턴한다.
        CREATE_TABLE  =  intCount
End  Function

 

Private  Sub  Command1_Click()
        Dim  wrkDATA  As  Workspace
        Dim  dbsDATA  As  Database
       
        Dim  strTable  As  String
        Dim  strSQL  As  String
        Dim  strValue  As  String
       
        Dim  intCount  As  Integer
        Dim  i  As  Integer
        Dim  x  As  Integer
        Dim  intField  As  Integer
       
        '  Data1  데이타콘트롤에  엑셀파일을  연결하여  오픈한다.
        Data1.Connect  =  "Excel  8.0;"


        '  엑셀파일을  지정한다.
        Data1.DatabaseName  =  "C:\Book1.xls"


        '  엑셀파일내의  쉬트를  지정한다.  ($  표시가  쉬트명  뒤에  붙는다.  주의)
        Data1.RecordSource  =  "tb_test$"
        Data1.Refresh
       
        '  엑셀파일안의  데이타  갯수  (레코드  카운트)  를  읽어온다.
        Data1.Recordset.MoveLast
        intCount  =  Data1.Recordset.RecordCount
        Data1.Recordset.MoveFirst
       
        '  생성할  MDB  파일명
        STR_MDB  =  "c:\test.mdb"
       
        '  엑셀파일의  테이블명에서  마지막문자인  $  표시를  제거하여  테이블명을  만든다.
        strTable  =  Mid(CStr(Data1.RecordSource),  1,  Len _   

                          (CStrData1.RecordSource))  -  1)


        '  MDB  를  생성한다.  (리턴값은  엑셀파일안의  필드  갯수)
        intField  =  CREATE_TABLE
       
        '  생성한  MDB  를  오픈한다.
        Set  wrkDATA  =  CreateWorkspace("",  "admin",  "",  dbUseJet)
        Set  dbsDATA  =  wrkDATA.OpenDatabase(STR_MDB,  False,  False)
       
        '  엑셀파일에서  데이타를  읽어서  MDB  에  저장한다.
        For  i  =  1  To  intCount
                strValue  =  "'"  &  Data1.Recordset.Fields(0)  &  "'"
                For  x  =  1  To  intField  -  1
                        strValue  =  strValue  &  ",  '"  &  Data1.Recordset.Fields(x)  &  "'"
                Next  x
               
                strSQL  =  "INSERT  INTO  ""  &  strTable  &  ""  VALUES("  &  strValue  &  ")"
                '                                          ++                            ++
                '  만약에  ++  부분이  두개의  큰따음표로  보이면  하나로  수정하십시요. 

                ' 원래  하나입니다.


                dbsDATA.Execute  strSQL
                Data1.Recordset.MoveNext
        Next  i
       
        dbsDATA.Close
        wrkDATA.Close
       
        Set  dbsDATA  =  Nothing
        Set  wrkDATA  =  Nothing
End  Sub

 

 

 

위의것은 DB를 생성하면서 엑셀 화일을 만든 디비에 집어늫는것이고요

이방식말고..

 

 

만들어놓은 DB에 ADO방식으로 엑셀데이터를 입력하고싶은데

전혀감이 안옵니다..

만들테이블 명은 ATABLE이구요..

컬럼(필드)명은 num , nam, nrm입니다..

도와주십시요..

 

 
 
질문자가 선택한 답변 
re: 비주얼베이직..엑셀파일을 mdb(ado방식)로 저장하는 프로그램입니다. 
 
kabiyo (2005-06-23 22:46 작성) 
이의제기 | 신고
 
 질문자 평
^^ 감사합니다.. 데브피아랑 하우투는 이미 알고 있는데 거긴 없어서 ..ㅎ 암튼 고맘습니다.. 즐거운하루 상퀘한 하루 .. 
 
MSDN에 ADO에 대해서 검색해서 보시면 도움이 될겁니다

 

www.devpia.com

 

www.howtobank.net

 

여기 가시면 vb에 대한 많은 정보 얻으실수 있으시구요

 

제가 봤을땐 ADO도 특별한 방법 있는거 아닌거 같은데........

 

변수 선언할때 ADO형식으로 선언해주고......

 

ADO형식을 한번 참조해보세요 그러시면

 

코드 약간 수정으로  ADO연결 가능합니다
 

(출처 : '비주얼베이직..엑셀파일을 mdb(ado방식)로 저장하는 프로그램입니다.' - 네이버 지식iN)

[출처] mdb(ADO) 작성 방법|작성자 웰빙

 

728x90
반응형
:
Posted by mapagilove
2013. 3. 29. 11:06

엑셀VBA - 타이머 엑셀VBA 이야기2013. 3. 29. 11:06

728x90
반응형

 

엑셀VBA - 타이머 

출처 카페 > 파워포인트전문가클럽 | 후다닥
원문 http://cafe.naver.com/powerpoint/772
  STEP> 따라하기
 

PC의 가장 큰 미덕 중 하나는 빠르다는 것입니다. 분명 예전보다 빠른 컴퓨팅
의 시대에 살고 있지만 우리는 PC가 빠르다는 것을 오래 체감하진 못합니다. 새로운 PC를 사거나 업그레이드를 하거나 새로 OS를 막 설치했을 때 느끼려나...그런데 프로그래밍의 경우 종종 "빨리 빨리"가 아닌 잠깐 멈추고 싶은 경우가 생기죠 그래서 종종 몇 초를 멈추었다가 다시 시작하는 방법을 묻는 질문이 있습니다

그래서 생각하는 꼼수 중 하나는 수 십만 법을  헛 루프 돌리는 것입니다. For~Next Do~Loop를 사용하여 아무 하는 일 없이 수 십 만법 돌리도록 하는 것입니다. 그러나 이런 경우 성능이 좋은 PC와 그렇지 않은 PC간에 차이가 생길 겁니다. 성능이 좋아 수 십만 법의 루프를 10초 내 끝내는데, 성능이 떨어지는PC는 몇 10분 정도 걸리는 수가 있습니다. 그래서 오늘은 몇 가지의 시간지연함수를 소개하고자 합니다

<1> DelayTime()함수

다음의 DelayTime()함수 시작시점을 Timer함수로 얻어오고 여기에 원하는 시간을 더해 루프를 돌 때 마다 확인합니다. 물론 Do~Loop를 반복하는 동안 DoEvents를 사용하여 CPU를 독점하여 사용하지 않도록 합니다.

Sub DelayTime(PauseTime As Single)
    Dim start      As Single   

    start = Timer
    Do While Timer < start + PauseTime
        DoEvents
    Loop

End Sub

<2> WaitSeconds()함수

다음은 더 간단하게 한 줄로 끝내는 함수입니다. 아래의 WaitSeconds()함수Application개체의 Wait메소드를 사용합니다.

[Wait메소드에 대한 도움말]

지정한 시간 동안 실행 중인 매크로를 잠시 중지합니다. 지정한 시간이 되면 True를 반환합니다.

*중요*
Wait 메소드는 모든 작업을 일시 중지하여 Wait가 영향을 주는 동안 다른 작업을 실행할 수 없게 합니다. 그러나 인쇄나 재계산과 같은 백그라운드 작업은 계속할 수 있습니다.

Wait메소드 다음에 언제까지 중단할지를 지정합니다. 그래서 "Now+얼마"를 하면 지금으로부터 얼마간을 중단하게 됩니다.

Sub WaitSeconds(waitTime As Integer)
    Application.Wait (Now + TimeValue("00:00:" & Format(waitTime, "00")))

End Sub

<3> Sleep()함수

API함수를 사용하는 방법도 있습니다. Sleep()이라는 함수를 사용하는데, 매개변수로는 밀리세컨즈를 줍니다. 그러니까 우리에게 친숙한 초 단위를 밀리세컨즈로 바꾸려면 1000을 곱하면 됩니다. 가령 다음의 경우 3초를 지연시키기 위해‘3000'을 주었습니다.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep (3000)  '// Will pause for 3 seconds

<4> GetTickCount함수

또 다른 API함수로 GetTickCount라는 함수를 사용하기도 합니다.

Declare Function GetTickCount Lib "kernel32" () As Long 

Sub Delay(nSeconds As Long)
  Dim TimeOut As Long 

  TimeOut = (GetTickCount / 1000) + nSeconds
  Do
    DoEvents
  Loop Until TimeOut < (GetTickCount / 1000)
End Sub


728x90
반응형
:
Posted by mapagilove
반응형