기본 콘텐츠로 건너뛰기

라벨이 VB인 게시물 표시

Val 함수 버그

VB는 거의 사용하지 않는데, 문의가 와서 확인을 해보니 아래와 같이 Val 함수 버그가 있었습니다. Val ( "5D1" ) 결과값을 5로 기대하겠지만 Val 함수는 50을 리턴합니다. 즉 이러한 문제를 피하기 위해 하는 수 없이 함수를 만들어 사용해야만 합니다. Function myInt ( s As String ) As Integer For i = 1 To Len ( s ) If IsAlpha ( Mid ( s , i , 1 ) ) Then Exit For End If Next If i > 1 Then s = Mid ( s , 1 , i - 1 ) End If myInt = Val ( s ) End Function Function IsAlpha ( s As String ) As Boolean Dim i As Integer Dim ch As Byte IsAlpha = True For i = 1 To Len ( s ) ch = Asc ( UCase $ ( Mid ( s , i , 1 ) ) ) If Not ( ( ch > = 65 ) And ( ch < = 90 ) ) Then IsAlpha = False Exit For End If Next i End Function --- Val 에러를 방지하는 방법 Many programmers use VB's Val() function to convert user inputted strings into numbers. This useful function returns zero (0) f...

문자열 함수 테스트

Dim CmdLine As String Dim Tokens ( 3 ) As String Dim position ( 2 ) As Integer CmdLine = Chr ( 34 ) + "a.exe" + Chr ( 34 ) + " " + Chr ( 34 ) + "b c d" + Chr ( 34 ) + " " + Chr ( 34 ) + "e f" + Chr ( 34 ) position ( 0 ) = InStr ( CmdLine , Chr ( 34 ) ) position ( 1 ) = InStr ( position ( 0 ) + 1 , CmdLine , Chr ( 34 ) ) Tokens ( 0 ) = Mid ( CmdLine , position ( 0 ) + 1 , position ( 1 ) - position ( 0 ) - 1 ) position ( 0 ) = InStr ( position ( 1 ) + 1 , CmdLine , Chr ( 34 ) ) position ( 1 ) = InStr ( position ( 0 ) + 1 , CmdLine , Chr ( 34 ) ) Tokens ( 1 ) = Mid ( CmdLine , position ( 0 ) + 1 , position ( 1 ) - position ( 0 ) - 1 ) position ( 0 ) = InStr ( position ( 1 ) + 1 , CmdLine , Chr ( 34 ) ) position ( 1 ) = InStr ( position ( 0 ) + 1 , CmdLine , Chr ( 34 ) ) Tokens ( 2 ) = Mid ( CmdLine , position ( 0 ) + 1 ,...

DBF 파일 ADO 연결

黑夢 | 흑몽 http://blog.naver.com/hiphoptrain/130013726697 Dim adoCon As New ADODB.Connection Dim adoRs As New ADODB.Recordset Private Sub Form_Load()     Dim sFilename As String     Dim sQuery As String         ' dbf에 연결하기 위해 ConnectionString을 설정한다.     adoCon.ConnectionString = "Provider=MSDASQL.1;Extended Properties=DSN=Visual FoxPro Database;SourceDB=" & App.Path & ";SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=MACHINE;Null=Yes;"     adoCon.Open         ' DB에 연결한다.         sFilename = "test.dbf"      ' DB 파일명         sQuery = "select * from " & sFilename     ad...

외부 프로그램 실행 및 종료

꼭 붙자! 취업블로그 | swome http://blog.naver.com/swome/30010069368 '----- 실행 Dim PROC As Integer PROC = Shell("C:\TEST_PROCESS.exe", AppWinStyle.NormalFocus) '----- 종료 Dim GP As System.Diagnostics.Process GP = System.Diagnostics.Process.GetProcessById(PROC) GP.Kill() GP = Nothing

VB For ~ Next 문

Amour au Claire de Lune... [ 달빛속의 사랑 ] | 오빠달려 http://blog.naver.com/akusi/20002038669 Private Sub Form_Activate() Dim t As Integer t = Val(InputBox("숫자입력", "숫자입력")) If t < 10 Or t > 30 Then MsgBox "10에서30사이수를입력", vbCritical + vbOKOnly t = Val(InputBox("숫자입력", "숫자입력")) End If For i = 10 To t Print "2^" & i & "= " & 2 ^ i Next End Sub -------------------------------------------------------------------------------------- Private Sub Form_Click() Dim n As Integer Dim msg As String msg = InputBox("문자입력", "문자입력하시오") For n = 1 To Len(msg) Print Left(msg, n) Next For n = Len(msg) To 1 Step (-1) Print Left(msg, n) Next End Sub

DLL calling convention

오늘 조금 희한한 경우를 발견했습니다. 다름이 아니라 VC++ 아래와 같이 정의한 함수를 1 2 3 4 5 extern   "C"  DLL_EXPORT void  DGN2NSQ( const   char *  pExportFilePath, const   char *  pImportFilePath ,  const   char *  pIniFilePath ) { ... 생략 } Colored by Color Scripter cs VB에서 아래와 같이 선언한 뒤 VB CODE를 컴파일해도 아무런 에러를 발생시키지 않고 컴파일이 성공되었습니다. 매개 변수 하나를 선언하지 않았는데도 말이죠. 1 2 Declare  Sub  DGN2NSQ Lib  "IEManager.dll"  _ ( ByVal  ExportFilePath  As   String ,  ByVal  ImportFilePath  As   String ) cs VC++의 함수에서 디버깅을 해보면 제일 마지막의 값은 쓰레기 값이 넘어오는 것을 확인할 수 있었습니다. DLL함수 호출 규약을 __stdcall으로 바꾸어 테스트를 한번 해 보아야 겠습니다. - 결론 : VB는 똑똑하게(?) 인자 갯수를 다르게 선언하고 또 사용하고 해도 컴파일때 에러를 내지 않습니다. 뭐 이런게 다 있을까요?

VC에서 VB DLL 호출하기

원본 따라가기 : http://alexk.springnote.com/pages/2954834 제일 밑의 <추가> 부분이 제가 VB를 사용하는 이유입니다. VB DLL은 액티브엑스 방식이어서 일반 VC에서 사용하는 DLL호출방법은 쓸 수가 없습니다. 여기 VB DLL을 불러서 사용하는 괜찮은 방법을 소개할 까 합니다. 제가 지금 사용중인데 매우 잘 돌아갑니 다. 1. VB으로 MurickCom이라는 프로젝트에 clsMurick라는 클래스를 만들어서 함수를 등록시킵니다. 2. 주의사항은 될 수 있는데로 함수에서 사용하는 리턴형과 아규먼트의 타입을 정확히 기재합니다.이것을 안해주게 되면 나중에 C에서 Variant라는 잡변수형태로 나타나게 됩니다. 이거 처리하는거 어렵습니다. 예를 들어 Public Function CountStringLength(ByVal strValue As String) As Long If strValue = vbNullString Then CountStringLength = 0 Else CountStringLength = Len(strValue) End If End Function 라고 합니다. 3. DLL을 만듭니다. 예를 들어 C:\Murick에 만들었다고 가정하지요. File -> Make MurickCom.dll 4. 그리고 Visual Studio 6.0 폴더에 Visual Studio 6.0 도구들이라고 있습니다. 여기에 OLEViewer라고 있습니다. 요놈을 클릭하면 어플리케이션이 나타나는데 좌측 트리에 Type Libraries를 더블클릭합니다. 그밑으로 현재 사용중인 OLE의 DLL파일들이 좌악 나타나지요. 제목으로 방금 만든 MurickCom.dll을 찾습니다. 만약 외부에서 만든 dll이면 시작 메뉴 -> 실행 -> regsvr32 경로\~.dll 엔터를 치시면 등록됩니다. 5...

[VB] DLL 호출

간만에 VB 6.0으로 작업할 일이 생겼는데, VC 6.0으로 만든 DLL 함수를 호출하고 나서 프로그램이 죽는 현상이 발생했습니다. 그 DLL은 이제까지 아무 문제 없이 잘 사용해 왔습니다. 그 원인을 몰라 한참이나 코드를 들여다 보고 있다가, 문득 DLL 호출은 일반 함수에서 하면 에러가 발생한다는 얘기를 생각해 내었습니다. 'DLL 함수 호출은 이벤트 처리 함수에서 호출해야 한다.' 그 이유는 잘 모르겠습니다.

Microstation J를 VB에서 호출하기

먼저 VB에서 호출하기 위해서는 레지스트리에 Microstation.Application의 PROGID가 아래와 같이 존재하여야 합니다. 먼저 VB에서 호출하기 위해서는 레지스트리에 Microstation.Application의 PROGID가 아래와 같이 존재하여야 합니다. 여기서 msApp의 Visible을 활성화 시키지 않으면 msApp에 명령어를 보내기 위해 사용하는 MbeSendCommand가 제대로 실행되지 않습니다. --> 주의 위 코드는 msApp를 생성해서 명령행으로 주어지는 dgn 파일을 오픈하는 코드입니다. 위와 유사한 코드를 Python에서 하려고 시도했었는데, Python에서는 msApp Object를 제대로 가져오지 못하고 에러가 발생하더군요. 이런면을 보면 VB가 참 잘 만들어 졌다고 보여집니다. 위의 코드는 수정되어야 합니다. MSTN J 상위 버젼이 설치되어 있는 경우에 위의 코드는 제대로 작동하지 않습니다. 그래서 트릭으로 MSTN J를 Shell 함수를 통해서 강제로 실행 시킨 후에 GetObject("","Microstation.Application") 을 통해서 Microstation Object를 가져올 수 있습니다. 이것 마저도 되지 않을때 MSTN J를 다시 설치하시면 될것입니다.

VB를 통한 FrameWork 자동 로드

FrameWork을 자동으로 로딩하는 것에 대해 알아봅시다. 물론 PC에 FrameWork이 설치되어 있어야 하겠지요. 현재 디렉토리를 Microstation이 설치되어 있는 디렉토리로 설정합니다.(SetCurrentDirectory) Shell을 이용해서 mod 폴더에 있는 FrameWork dgn 파일을 오픈합니다. Set msApp = GetObject("" , "Microstation.Application") fwstart.ma 파일을 로드합니다. msApp.MbeSendCommand("MDL LOAD FWSTART.MA") 다시 시간이 걸립니다. 이렇게 하면 성공적으로 FRAMEWORK을 로드할수 있습니다. 한가지 주의할 사항은 위의 절차대로 하기 전에 반드시 MS , FW_PRODUCT 이 두 환경변수를 설정해 줘야 한다는 겁니다. 예) "FW_PRODUCT"="C:\\WIN32APP\\INGR\\FWPLUS\\" "MS"="C:\\Bentley\\Program\\MicroStation\\ustation.exe"

VB용 ocx에 사용자 정의 속성 추가

먼저 VB의 추가기능 관리자에서 ActiveX 컨트롤 인터페이스 마법사 를 로드합니다. ActiveX 컨트롤 인터페이스 마법사 를 실행합니다. 이 화면은 그냥 건너뜁니다. 우리는 사용자 속성을 추가할것이기 때문에 이 화면도 건너뜁니다. 기존에 추가시킨 속성이 하나 보이는군요. 그럼 추가 버튼을 눌러 새로운 속성을 추가시켜 봅시다. 메서드를 추가시킬려면 형식에서 메서드(M)을 선택하시면 됩니다. 여기서는 MaterialBalanceFile과 EqlistFile 두개의 속성을 새롭게 추가시켰습니다. 추가시킨 속성의 데이터 형식을 설정합니다. 데이터 형식까지 설정을 마쳤으면 모든 작업이 끝났습니다.

엑셀 sheet를 복사하여 다른 엑셀 파일에 붙이기.

- 코드 - Dim XL1, XL2 As Application Dim wb1, wb2 As Workbook Dim s1, s2 As Worksheet Set XL1 = CreateObject("Excel.Application") XL1.Visible = False Set wb1 = XL1.Workbooks.Open(txtOldFile.Text) 'material balance file; Set XL2 = CreateObject("Excel.Application") XL2.Visible = False Set wb2 = XL2.Workbooks.Open(txtNewFile.Text) 'equipment list file' 'material balance sheet를 eqlist의 제일 마지막에 복사' XL1.Worksheets("Material").UsedRange.Copy Set NewSheet = XL2.Worksheets.Add(After:=XL2.Worksheets(XL2.Worksheets.Count)) NewSheet.Range("A2").PasteSpecial Paste:=xlValues NewSheet.Name = "Material" XL2.DisplayAlerts = False wb2.SaveAs (txtNewFile.Text) XL2.DisplayAlerts = True XL1.DisplayAlerts = False XL1.Quit XL2.Quit Set XL1 = Nothing Set XL2 = Nothing

문자열 구분

문자열을 구분자로 나누어서 반환값들을 받을때 C++에서는 CTokenizer라는 클래스를 만들어서 사용했었습니다. 하지만 VB에서는 그러한 함수를 기본으로 제공하고 있습니다. Dim szBuf as String Dim Tokens() As String Tokens = Split(szBuf, ":") szBuf에 들어있는 문자열을 ':' 으로 나누어서 Tokens라는 배열에 저장합니다.