안녕하세요


http://support.microsoft.com/kb/210586를 참고하여

엑셀에서 입력된 아라비아 숫자를 영문으로 변환해 사용중 입니다만

여기서 일의 자리와 소수점 사이 'AND'를 'AND CENTS'로 변경 할 수 있을까요?

(예) 현재는 =ConvertCurrencyToEnglish(10.20) 입력시 TEN AND TWENTY로 변환

(요청)  TEN AND CENTS TWENTY로 바꾸고 싶습니다.

너무 쉬운 질문을 해서 죄송합니다..


================================================






안녕하세요.

말씀하신 변환 결과가 아래와 같은지 부터 한번 확인해보세요.

s = ConvertCurrencyToEnglish(10.2)

 -> Ten And Cents Twenty

s = ConvertCurrencyToEnglish(100.1)

 -> One Hundred And Cents Ten

s = ConvertCurrencyToEnglish(10)

 -> Ten And No Cents

위의 결과가 맞다면, 아래의 소스가 말씀하신대로 변환한 결과가 되겠습니다.

Function ConvertCurrencyToEnglish(ByVal MyNumber)
   Dim Temp
   Dim Dollars, Cents
   Dim DecimalPlace, Count

   ReDim Place(9) As String
   Place(2) = " Thousand "
   Place(3) = " Million "
   Place(4) = " Billion "
   Place(5) = " Trillion "

   ' Convert MyNumber to a string, trimming extra spaces.
   MyNumber = Trim(Str(MyNumber))

   ' Find decimal place.
   DecimalPlace = InStr(MyNumber, ".")

   ' If we find decimal place...
   If DecimalPlace > 0 Then
      ' Convert cents
      Temp = Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2)
      Cents = ConvertTens(Temp)

      ' Strip off cents from remainder to convert.
      MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
   End If

   Count = 1
   Do While MyNumber <> ""
      ' Convert last 3 digits of MyNumber to English dollars.
      Temp = ConvertHundreds(Right(MyNumber, 3))
      If Temp <> "" Then Dollars = Temp & Place(Count) & Dollars
      If Len(MyNumber) > 3 Then
         ' Remove last 3 converted digits from MyNumber.
         MyNumber = Left(MyNumber, Len(MyNumber) - 3)
      Else
         MyNumber = ""
      End If
      Count = Count + 1
   Loop

   ' Clean up dollars.
   'Select Case Dollars
   '   Case ""
   '      Dollars = "No Dollars"
   '   Case "One"
   '      Dollars = "One Dollar"
   '   Case Else
   '      Dollars = Dollars & " Dollars"
   'End Select

   ' Clean up cents.
   Select Case Cents
      Case ""
         Cents = " And No Cents"
      Case "One"
         Cents = " And One Cent"
      Case Else
         Cents = " And " & "Cents " & Cents
   End Select

   ConvertCurrencyToEnglish = Dollars & Cents
End Function

Private Function ConvertHundreds(ByVal MyNumber)
   Dim Result As String

   ' Exit if there is nothing to convert.
   If Val(MyNumber) = 0 Then Exit Function

   ' Append leading zeros to number.
   MyNumber = Right("000" & MyNumber, 3)

   ' Do we have a hundreds place digit to convert?
   If Left(MyNumber, 1) <> "0" Then
      Result = ConvertDigit(Left(MyNumber, 1)) & " Hundred "
   End If

   ' Do we have a tens place digit to convert?
   If Mid(MyNumber, 2, 1) <> "0" Then
      Result = Result & ConvertTens(Mid(MyNumber, 2))
   Else
      ' If not, then convert the ones place digit.
      Result = Result & ConvertDigit(Mid(MyNumber, 3))
   End If

   ConvertHundreds = Trim(Result)
End Function

Private Function ConvertTens(ByVal MyTens)
   Dim Result As String

   ' Is value between 10 and 19?
   If Val(Left(MyTens, 1)) = 1 Then
      Select Case Val(MyTens)
         Case 10: Result = "Ten"
         Case 11: Result = "Eleven"
         Case 12: Result = "Twelve"
         Case 13: Result = "Thirteen"
         Case 14: Result = "Fourteen"
         Case 15: Result = "Fifteen"
         Case 16: Result = "Sixteen"
         Case 17: Result = "Seventeen"
         Case 18: Result = "Eighteen"
         Case 19: Result = "Nineteen"
         Case Else
      End Select
   Else
      ' .. otherwise it's between 20 and 99.
      Select Case Val(Left(MyTens, 1))
         Case 2: Result = "Twenty "
         Case 3: Result = "Thirty "
         Case 4: Result = "Forty "
         Case 5: Result = "Fifty "
         Case 6: Result = "Sixty "
         Case 7: Result = "Seventy "
         Case 8: Result = "Eighty "
         Case 9: Result = "Ninety "
         Case Else
      End Select

      ' Convert ones place digit.
      Result = Result & ConvertDigit(Right(MyTens, 1))
   End If

   ConvertTens = Result
End Function

Private Function ConvertDigit(ByVal MyDigit)
   Select Case Val(MyDigit)
      Case 1: ConvertDigit = "One"
      Case 2: ConvertDigit = "Two"
      Case 3: ConvertDigit = "Three"
      Case 4: ConvertDigit = "Four"
      Case 5: ConvertDigit = "Five"
      Case 6: ConvertDigit = "Six"
      Case 7: ConvertDigit = "Seven"
      Case 8: ConvertDigit = "Eight"
      Case 9: ConvertDigit = "Nine"
      Case Else: ConvertDigit = ""
   End Select
End Function


X좌표, Y좌표를 알고있다면,

LineShape 오브젝트를 이용해서 차트보다 위로 series 없이 선을 그을수 있습니다.

우선 아래와같이 해보세요.

1. Visual Basic Power Packs Controls 을 다운받습니다.
https://msdn.microsoft.com/ko-kr/library/cc488277.aspx

주의 이것을 다운받아서 설치하실때에는, 기동중인 Visual Studio 를 종료하셔야합니다.

2. 툴 탭의 툴박스 아이템선택 을 누릅니다.

3. line 으로 검색해봅니다.

 -> LineShape 가 나올껍니다. 그걸 선택해서 툴박스에 추가합니다.

4. 코드를 입력합니다. (샘플)

        Dim canvas As New ShapeContainer
        Dim theLine As New LineShape
        canvas.Parent = Me

        theLine.Parent = canvas
        theLine.StartPoint = New System.Drawing.Point(0, 0)
        theLine.EndPoint = New System.Drawing.Point(640, 480)
        canvas.BringToFront()

LineShape 가 작성된 캔버스를 최상위로 올려줌으로써 챠트위에 선이 그려집니다.


샘플예제 다운로드

LineShape.zip


패스워드

racer42

csv 파일 데이터그리드뷰에 불러오기 도움이 필요합니다.  



csv 파일을 데이터그리드뷰로 불러와서 처리하려합니다.
파일을 콤마로 나눠서 셀에 불러오게되는데 콤마가 들어간 내용이 한두곳에 존재하게되서 데이터를 못읽어옵니다..
어느부분을 수정해야할지 도움부탁드립니다.
 
(* "csv", "텍스트 콤마" 검색으로는 정보를 찾을수가 없어 질문드립니다.)
 
 
====== 코드 내용 =======
 
        Dim filename = "d:\test.csv"
        Dim connString = String.Format("Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=no;FMT=Delimited""", Path.GetDirectoryName(filename))
        Using cn = New OleDbConnection(connString)
            cn.Open()
            Dim csvFile As String = "SELECT * FROM [" + Path.GetFileName(filename) + "]"
            Using adapter = New OleDbDataAdapter(csvFile, cn)
                Dim ds = New DataSet()
                adapter.Fill(ds)
                DataGridView1.DataSource = ds.Tables(0)
                cn.Close()
                Beep()
            End Using
        End Using
 
 
 
csv 파일을 메모장에서 불러왔을때
csv 메모장으로 열었을때
 
 
 
csv 파일을 엑셀에서 불러왔을때
csv 엑셀로 열었을때
 
 
 
vb 코드 실행했을시 빈 칸 발생
vb 실행했을때



참, 정리가 잘 된 질문이다.
무엇을 물어보고자 하는지가 명확하게 보인다.
이 질문에 대해서 답변을 하고자, 좀 정리해보았다.
샘플파일을 첨부한다.

아래가 해결방안


        Dim csvDir As String = "C:\test\"

        Dim csvFileName As String = "test.csv"


        Dim conString As String = _

            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _

            + csvDir + ";Extended Properties=""text;HDR=No;FMT=Delimited"""

        Dim con As New System.Data.OleDb.OleDbConnection(conString)


        Dim commText As String = "SELECT * FROM [" + csvFileName + "]"

        Dim da As New System.Data.OleDb.OleDbDataAdapter(commText, con)


        Dim dt As New DataTable

        da.Fill(dt)


        DataGridView1.DataSource = dt



해당 소스를 첨부는 아래를 참고하세요.


[소스]


WindowsApplication2.zip



[테스트용 csv 파일]


test.csv



즐프하세요.

vb6 마이그레이션 했습니다.

'--------------------Module 부분-------------------------

 Public Sub OpenRlquid_init(ByRef frmTmp As System.Windows.Forms.Form)


  Dim tmpLI As System.Windows.Forms.ListViewItem
  Dim clmX As System.Windows.Forms.ColumnHeader '헤드를 정의 한다
  Dim ColumWidth As Single
  'UPGRADE_NOTE: Str이(가) Str_Renamed(으)로 업그레이드되었습니다. 자세한 내용은 다음을 참조하십시오. 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="A9E4979A-37FA-4718-9994-97DD76ED70A7"'
  Dim Str_Renamed As String
  Dim i As Short
  Dim Scnt As Short
  Dim DevRlquid(5) As String
  Dim headCnt As Short
  Dim RecordCnt As Short

 

 

with frmTmp ---> 전달받은 폼

     tmpLI = .LstRlquidInfo.Items.Add(TrimCStr(1))  ---->LstRlquidInfo 에 에러가 나네요   

end with

 

 

LstRlquidInfo : 호출폼에 있는  Listview 컨트롤입니다.

다른 폼에서 모듈에 있는 공통처리 OpenRlquid_init(frmtestconf) 를 호출합니다.

 

소스 첨부하였습니다.



위의 질문에 대해서 의문이 생겨서 답변을 하였습니다.

[제 답변]

단 전체적으로 말씀드리자면,

폼의 오브젝트가 제대로 넘어오지 않아서, 형변환 캐스팅이 필요했습니다.

 

1. 파라메터의 type을 수정해봤습니다.

그리고, 두번째문제.. 

기동은 그리하여 문제없이 빌드통과 하였는데, 응?? 그다음 뭘 하자는거지??

가만보니 Module 에서 string1 을 넣어주고 있네요.

아아... 리스트에 넣으려고 하셨구나...

 

2. 해당폼을 강제 호출해 보았습니다.

★제가 일본에 살아서(*일본OS를 쓰다보니), 한글이 깨집니다.

코멘트쪽이니 이해해주세요. 미안합니다.

진하게 처리한 부분이 수정부분입니다.

 

    Public Sub OpenRlquid_init(ByRef frmTmp As Form2)
        Dim tmpLI As System.Windows.Forms.ListViewItem
        Dim clmX As System.Windows.Forms.ColumnHeader 'ヌ・蟶ヲ チ、タヌ ヌムエル
        Dim ColumWidth As Single
        'UPGRADE_NOTE: Strタフ(ー。) Str_Renamed(タク)キホ セラキケタフオ蠏ヌセ悅タエマエル. タレシシヌム ウサソ・コ エルタスタサ ツ・カヌマスハステソタ. 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="A9E4979A-37FA-4718-9994-97DD76ED70A7"'
        Dim Str_Renamed As String
        Dim i As Short
        Dim Scnt As Short
        Dim DevRlquid(5) As String
        Dim headCnt As Short
        Dim RecordCnt As Short
 
        With frmTmp
            'UPGRADE_ISSUE: Control Lstlogタコ(エツ) Form タマケン ウラタモスコニ菎フスコ セネソ。 タヨタクケヌキホ ネョタホヌメ シ・セタエマエル. タレシシヌム ウサソ・コ エルタスタサ ツ・カヌマスハステソタ. 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="084D22AD-ECB1-400F-B4C7-418ECEC5E36E"'
            tmpLI = .ListView1.items.Add(Trim(CStr(1)))
 
        End With
 
        Form2.Show()
 
    End Sub



수정한 전체 소스코드를 첨부합니다.


WindowsApplication1.zip



엑셀파일의 행 갯수가 10만건 정도됩니다..

품목은있고  값이 공백이나 0의 데이터가 많이들어있습니다..

필요없는 행들이 많아서 삭제하고 용량을 줄이려합니다..

 

행의 값이 공백이나 0이면 해당 행을 삭제하려합니다..

 

품목

수량

금액

합계

나사

2

100

200

피스

 

 

 

자석

1

1000

1000

볼트

0

 

 

 

 

 

품목

수량

금액

합계

나사

2

100

200

자석

1

1000

1000

 

이렇게 바꾸고싶습니다..






위의 글에 대한 답변입니다.

샘플 소스를 만들었기에 공유합니다.



test.xlsm


다운받아서 버튼 눌러보세요~

매크로로 제작하였습니다.

네트워크 (인트라넷) 등에 파일을 전송하는 프로그램을 만들어서 스케쥴러로 관리하고자 하는 목적으로 작성하였습니다.

 

 

 

 

1. TaskManager 에 등록해서 일정시간을 주기로 정기적으로 구동하는 프로그램을 작성 (가칭 A)

2. 네트워크에 파일을 전송하는 프로그램을 작성 (가칭 B, NetWork / FTP)

 

오늘은 2의 상세버젼 (네트워크 파일복사 / 폴더작성) 을 위한 프로그램에 대해서 설명합니다.

 

파일전송 방식은 여러방법이 있습니다만, 여기서는 네트워크 전송에 대해서 서술합니다.

다음번 포스팅에서는 FTP 전송에 대해서 서술하겠습니다.

 

A. 폴더존재여부를 확인해서 존재하지않는경우 폴더를 작성한다. (권한필요)

※folderPath = 확인할 폴더의 FullPath

      If Not System.IO.Directory.Exists(folderPath) Then
           System.IO.Directory.CreateDirectory(folderPath)
      End If

 

B. System.IO.File.Copy 를 이용해서 대상파일을 복사한다. 

      System.IO.File.Copy(복사할대상파일, 복사하고싶은곳, True)

 

위에서 세번째 파라메터로 True 를 설정하면, 복사하고싶은곳에 해당 파일이 존재할경우 덮어쓰기를 합니다.

주의) 복사하고싶은곳 은 파일명까지 FullPath 를 입력하여야 합니다.

 

간략하게 네트워크상 파일을 복사하는 방법에 대해서 알아보았습니다.

여기서 참고로 복사할대상파일의 파일이름만 가져오는 방법은 IO.Path.GetFileName 메소드를 이용하는것 입니다.

      IO.Path.GetFileName(복사할대상파일)

 

위와같이 설정하면, FullPath 에서 파일이름만 취득해서 반환해줍니다.

Framework 4.0 부터 exe 파일간에 메모리 매핑 (MemoryMappedFile) 메소드를 사용해서

필요한 데이터를 공유할수 있다.

 

 

상속상위 계층

System.Object
  System.IO.MemoryMappedFiles.MemoryMappedFile

 

 

MemoryMappedFile 메소드를 이용하여 데이터를 쉽게 공유할수 있다.

물론 타겟이 되는 폼의 New 메소드에 파라메터로 전달하는 방법도 있지만,

MemoryMappedFile 의 경우는 타 exe 파일들간에 데이터 공유도 손쉽게 할수있다는 장점이 있다.

 

사용법은 아래와 같다.

 

<메모리에 쓰는방법>

     ''' <summary>
    ''' 메모리에 쓰는방법
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub MakeMemoryMappedFile(ByVal tar As String, ByVal tarText As String)
        'Dim File = MemoryMappedFile.CreateOrOpen(target, MaxSize)
        Dim File = MemoryMappedFile.CreateOrOpen(target, MaxSize)
       
        Dim bytes = New Byte() {}
        bytes = StrToByteArray(tarText)

        Using writer = File.CreateViewAccessor(0, bytes.Length)

            writer.WriteArray(Of Byte)(0, bytes, 0, bytes.Length)

        End Using

 

    End Sub

 

 

 

<메모리로부터 읽는방법>

 
    ''' <summary>
    ''' 메모리로부터 읽는방법
    ''' </summary>
    ''' <remarks></remarks>
    Private Function ReadMemoryMappedFile(ByVal tarMem As String) As String
        Dim result As String = ""

        Try
            Using file = MemoryMappedFile.OpenExisting(tarMem)
                Using reader = file.CreateViewAccessor(0, MaxSize)

                    Dim bytes = New Byte(MaxSize) {}
                    reader.ReadArray(Of Byte)(0, bytes, 0, bytes.Length)

                    result = System.Text.Encoding.UTF8.GetString(bytes)

                End Using
            End Using

            Return result

            'Catch noFile As FileNotFoundException
            '    MsgBox("Error : " + noFile.Message)
            '    Return result

        Catch Ex As Exception
            Return result
        End Try

    End Function

 

 

<실제 사용예제> 

 

 MakeMemoryMappedFile(키값, 넣을내용)
 

 ReadMemoryMappedFile(키값)

 

 

 

필자는 위의 방법으로 현재 개발중인 exe 모듈 140여개인 SmartClient 솔류션 간의 공통데이터 공유에 적용중이다.

 

물론, 데이터를 암호화해서 암호화된 값을 넣어두고

끌어다쓰는 모듈쪽에서 복호화해서 받아쓰는 방법이 보안상은 좀 더 나을것이다.

폼 어플리케이션을 사용하다보면

폼을 가장 상위에 위치시켜야하는 경우가 있다.

 

이럴때에 간단하게 한줄로 제어할수 있는 방법

 

 

Me.TopMost = True 

 

True 설정으로 최상위에 위치시킬수 있고,

반대로 False 설정으로 최상위 설정을 해제시킬수 있다.

Windows8 Apps 개발을 위해서는 개발자 라이센스가 필요합니다.

 

주말에 윈도우8 엔터프라이즈를 설치하고,

Visual Studio 2012 Ultimate 를 설치했습니다.

 

그리고 개발자 라이센스를 등록하였습니다.

 

 

 

 

이로써 윈도우8 앱을 개발하기 위한 모든 준비는 끝났습니다.

개발에 대해서 진행사항은 추후 조금씩 포스팅 하도록 하겠습니다.

 

안녕하세요.

VB MVP 고성만 입니다.

포럼의 난수발생 프로그램에 대해서 올려주신 질문에대한 답변입니다.

http://social.msdn.microsoft.com/Forums/ko-KR/visualbasicko/thread/940b0621-4148-4392-bb19-fd886d81c942

 

1. 난수발생시 0 이 발생할수 있다.

2. 100번만에 세가지 난수가 같은 경우가 없을수 있다.

 

소스 자체에는 크게 문제가 없습니다.

제가 조금 수정한 아래의 소스를 참고해 보세요.

반복중에 당첨숫자가 나오면 프로그램을 종료합니다.

 

 

gompang2.zip

소스파일 다운로드

 

 

 

 

 

 

 

Public Class Form1


    Private Sub onTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles onTimer.Tick
        Dim a(2) As Integer
        Dim result As Integer

        a(0) = Int(9 * Rnd() + 1)
        a(1) = Int(9 * Rnd() + 1)
        a(2) = Int(9 * Rnd() + 1)

        randomNum1.Text = a(0)
        randomNum2.Text = a(1)
        randomNum3.Text = a(2)

        If a(0) = a(1) And a(1) = a(2) And Not a(0) = 0 Then
            result = a(0)
            Call resultCall(result, True)
        End If

        Call resultCallEnd(result)

    End Sub

    Private Sub resultCall(ByVal result As Integer, ByVal judge As Boolean)

        If judge = True Then
            onSelecting.Text = ""
            onTimer.Enabled = False

            If Not result = 0 Then
                MsgBox("당첨되신 수는 : " & result & " 입니다 !! 축하합니다 ")
            Else
                MsgBox("꽝!! 다음기회를.... ")
            End If

        Else
            Progress.Value += 1

        End If

    End Sub


    Private Sub resultCallEnd(ByVal result As Integer)

        If (Progress.Value = Progress.Maximum) Then
            onSelecting.Text = ""
            onTimer.Enabled = False

            If Not result = 0 Then
                MsgBox("당첨되신 수는 : " & result & " 입니다 !! 축하합니다 ")
            Else
                MsgBox("꽝!! 다음기회를.... ")
            End If

        Else
            Progress.Value += 1

        End If

    End Sub


    Private Sub startBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startBtn.Click

        onTimer.Interval = 1
        onTimer.Enabled = True
        Progress.Value = 0
        Progress.Maximum = 1000
        onSelecting.Text = "추첨중입니다 ..."

    End Sub
End Class

 

 

 

도움되시길 바랍니다.

참고하세요.

+ Recent posts