1. FAQ
  2. 엑셀(Excel)
  3. AfterEffects
  4. Premiere
  5. Photoshop
  6. ETC

이 게시판은 아별닷컴 회원만 질문을 올릴 수 있습니다. 회원에게 주어지는 특권인셈이지요. 회원이 아닌 분들은 열람만 가능합니다.

안녕하세요. 아별님 파이스입니다.

이번에 드릴 질문은 VBA를 공부를 시작해야 되겠다! 라고 마음먹게된 배경에 있는...

오래된 숙원과제입니다. (물론 아별님한테는 아주 간단하시리라 짐작됩니다.)


이번엔 별도로 첨부파일은 없는데요. 코드를 바로 올려보겠습니다.


아참. 목표는 8자리의 서로다른 숫자와영문이조합된 값을 특정 셀 영역에 출력하는 것입니다.


1) 서로다른 숫자와영문 조합이란 = a345z98e / 1234567q / dkjfk89w 와 같이 숫자, 알파벳, 자리수까지 모두 난수여야합니다.

2) 특정 셀 영역이란 예를들어 A1~A100셀까지입니다. 이렇게 채워질 때 1)의 조건을 만족하지만, 모두 다른 값이 나와야 합니다.

3) 프로시저를 실행시킬 때마다 다른 값이 나와야 합니다.


현재까지 제가 작성해 본 것은,


Sub 비번생성2()


Dim i

Dim j

Dim aa As Long

Dim b

Dim c

Dim d

Dim e

Dim f

Dim g

Dim h


Randomize (1)


For i = 1 To 100

    For j = 0 To 100

    

    j = j + 1

    i = i + 1

    

    Cells(i, 1) = (aa & b & c & d & e & f & g & h)

    Cells(j, 1) = (aa & b & c & d & e & f & g & h)

    

    aa = Int((9 * Rnd) + 0)

    b = Int((9 * Rnd) + 0)

    c = Int((9 * Rnd) + 0)

    d = Int((9 * Rnd) + 0)

    e = Int((9 * Rnd) + 0)

    f = Int((9 * Rnd) + 0)

    g = Int((9 * Rnd) + 0)

    h = Int((9 * Rnd) + 0)

    

    Next j

Next i


End Sub


네 보여드리기도 부끄럽지만 여기까지입니다.

결과물은 A1~A104까지 8자리의 랜덤숫자 값 출력입니다. 알파벳 부분은 손도 못대고 있습니다;

바로 질문 드리도록 하겠습니다.



1. 원래는 반복문에 j라는 변수를 사용하지 않고 i만으로 충분할줄 알았는데요,

   이게 이상하게 그렇게하니 홀수행, 혹은 짝수행만 출력이 되더라구요,

   for i = 1 to 100 여기서 1을 0으로 바꾸니 나오지 않던 행들이 나와서,

   그래서 j까지 끌여다 쓰면 모든행을 채울 수 있지 않을까 싶어서 그렇게 한건데요...

   역시 정상적인 방법이 아닌 것 같습니다. 이 부분에 대해서 제가 뭘 착각하고 있는건지 가르침을 부탁 드리겠습니다.

   (그리고 위와 같이 하면 a2셀 값만 0이 나오고 a100이 아니라 a104까지 나오는데 이 부분도 미스테리 입니다;)



2. 숫자 랜덤 출력까지는 어떻게든 했는데요. 사실 여기까지만 할거 였으면

   그냥 엑셀상에서 randbetween하고 concatenate의 조합만으로 푸는게 훨씬 쉬웠을것 같은데요,

   역시 문제는 알파벳까지 조합되어야 한다는 것입니다.(그것도 자리수까지 난수로)

   음 저한테는 딱히 여기서 나아갈만한 방향이 현재로서는 없는상태인데요... 한 수 가르침을 부탁 드리겠습니다.



3. 끝으로 정말 부끄럽지만 Int((9 * Rnd) + 0)  이 부분 그냥 이해가 잘 안가서 외운 부분인데요,

   그냥 공식처럼 앞의 9와 뒤의 0 사이의 정수를 난수로 출력한다....고 알고있는데요

   제가 이해가 잘 안가는 부분은 rnd는 0과 1사이의 난수를 반환...이라고해서 0.32343443 이런값이 난수로 나오고,

   int는 정수형으로 바꿔주는 걸로 알고 있습니다. 실제로 직접입력창에 int(rnd)해도 0만 나오더라구요,

   그런데 어떻게 앞에 x를 넣고 곱하고 y를 더해주면 y와 x 사이의 정수값이 출력될 수 있는건지

   그 과정이 잘 이해가 되지 않습니다. ㅠ.ㅠ



그럼 편안한 밤 보내시고요, 답변은 시간 되실때 천천히 한수 가르침 부탁 드리겠습니다. ^^ 

고맙습니다.

   



댓글 '4'

profile

[레벨:30]아별

2011.11.30 16:47:18
*.104.126.21

안녕하세요? 파이스님? ^_^

질문을 읽어보다가.. 간결하다는 단어의 정의를 고민해봤습니다. ㅎㅎ

 

일단..

임의의 8자리 패스워드를 생성하고 싶으신거군요..

답변을 작성하다가.. 그냥 범용성 있는 패스워드 생성기를 만들어봤습니다. ㅎㅎ

http://www.abyul.com/zbxe/101921

 

 

[ 이하는 답변입니다~ ]

 

1. 순환문에는 For문과 Do~While 또는 Do~Until문이 있는데요..

    While이나 Until을 사용할때는 구문 안에 i = i+1처럼.. 단계별로 증가시키는 코드가 필요하지만..

    For문은 For문 자체에 증가시키는 코드가 포함되어 있지요..

    For i =1 To 100 이라는 구문 자체가 i를 1부터 100까지 하나씩 증가시키라는 의미입니다.

    즉.. For문을 사용하실때는 i=i+1을 사용하시면 안됩니다.

 

    파이스님의 코드를 정리해보면 아래와 같습니다.     

Sub 비번생성2()
    Dim i As Long, j As Long
    Dim a As Integer, b As Integer, c As Integer, d As Integer
    Dim e As Integer, f As Integer, g As Integer, h As Integer

    Randomize (1)
    For i = 1 To 100
        a = Int((8 * Rnd) + 1)
        b = Int((9 * Rnd) + 0)
        c = Int((9 * Rnd) + 0)
        d = Int((9 * Rnd) + 0)
        e = Int((9 * Rnd) + 0)
        f = Int((9 * Rnd) + 0)
        g = Int((9 * Rnd) + 0)
        h = Int((9 * Rnd) + 0)
        Cells(i, 1) = (a & b & c & d & e & f & g & h)
    Next i
   
End Sub

 

 

2. 무작위로 알파벳을 조합하는 방법에 대해 궁금하시군요..

 

     일단..

      1) 문자별로 아스키코드가 있다는 것을 아셔야하구요..

      2) 엑셀의 A1셀에 a를 입력했다고 하죠.. B1셀에 =CODE(A1)이라고 입력하면.. 97이라는 숫자가 나옵니다.

          소문자 a의 아스키코드는 97입니다. b는 98, c는 99... 머 이런 식입니다.

           대문자는 좀 앞쪽이죠.. A~Z가 65~90의 코드를 갖습니다. 소문자 a~z는 97~122이구요..

      3) 그렇다면.. A~Z사이의 임의의 문자를 뽑고 싶으면 어떻게 하시겠습니까?

           65~90사이의 숫자를 뽑아서 그 코드를 문자로 전환하는 Chr()함수를 이용하면 되겠죠?

           아래처럼 코딩하시면.. A~Z사이의 알파벳을 뽑아서 8자리를 만들어줍니다.

               For i = 1 To 8
                       strTemp = strTemp & Chr(Int(25 * Rnd + 65))
               Next i

 

3. Int((9 * Rnd) + 0) 구문이 이해가 안되시는군요..

     

      Rnd함수는 0부터 1사이의 실수를 결과값으로 돌려주는데요..

      거기에 9를 곱하면.. 9*Rnd는 0부터 9사이의 값을 갖게 됩니다.

      거기에 0을 더하면.. 머. 여전히 0부터 9사이의 값이겠죠..

      만약 1부터 9까지의 값을 원한다면.. Int((8 * Rnd) + 1)이라고 하면 되겠죠..

      8*Rnd가 0부터 8까지 값을 가지니까요. 0값을 가질때 1을 더하면 1이고.. 8값을 가질때 1을 더하면 9이 돼서.. 1~9

 

      Int()함수는 실수를 가장 가까운 정수로 내림해주는 함수니까..

      3.3324232라는 실수는 3이 되겠고.. 6.9973622라는 실수는 6이 되겠죠..

      그런식입니다. ㅎㅎ

 

도움이 되셨기를..

 

 

아참..

제가 만든 아별패스워드생성기의 VBA암호는 abyul.com 입니다.

밑에 쪼그맣게 적는 이유는.. 댓글을 얼마나 성의 있게 읽어보는지를 테스트하는 것이지요.. 후후..

 

 

 

중복되지 않는 값들을 만들때는.. 컬렉션이라는 것을 이용합니다.

    Set x = New Collection

    x.Add xMember, xMember

컬렉션 x의 구성원들은 각자 고유한 문자열 값을 가져야하는데..

기존의 있는 것과 같은 항목을 Add하려면 에러가 납니다.

에러가 안 날때까지 계속 새로운 값을 추가하면서 100개가 될때까지 돌리는 방법을 사용했습니다.

 

컬렉션 개체는 설명하자면 길어지니.. 제가 만든 아별패스워드생성기의 소스를 참고하시고..

자세한 것은 엑사모나 구글에서 컬렉션을 검색해서 공부하시기 바랍니다.

 

[레벨:6]파이스

2011.12.02 00:43:35
*.148.196.203

하하 ^^ 답변 감사드립니다.


3개의 질문 모두에 대해서 역시나 기대했던 것 이상의 확인하였습니다.

다만 이번 답변은 소화하는데 시간이 좀 걸릴것 같긴하네요. 모처럼 바쁜시간 남겨서 올려주셨으니 확실하게 알려주신 부분은

마스터 하도록 하겠습니다.


아 그리고 물론 댓글은 아주 세부적으로 보고 있습니다. 저는 밑에 쪼그맣게 적으셨다고 했는데

답변글 자체의 폰트크기는 다 같은것 같아서 어디 진짜 폰트 0.5포인트 짜리가 숨어있나 위아래로 찾아 봣을 정도 였습니다.ㅎ


음 아무튼 역시 이번에도 기대이상의 감동적인 답변, 다시 한번 감사드립니다. 행복한 주말 보내십시오 ^-^

[레벨:6]파이스

2011.12.02 01:17:00
*.148.196.203

Sub 울트라()
 Dim i As Long, j As Long
    Dim a As Integer, b As Integer, c As Integer, d As Integer
    Dim e As Integer, f As Integer, g As Integer, h As Integer
    Randomize (1)
    For i = 1 To 100
        a = Int((8 * Rnd) + 1) Or Chr(Int(25 * Rnd + 65))
        b = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        c = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        d = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        e = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        f = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        g = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        h = Int((9 * Rnd) + 0) Or Chr(Int(25 * Rnd + 65))
        Cells(i, 2) = (a & b & c & d & e & f & g & h)
        Next i
End Sub

위와같이 해보았는데, 노란색 부분에서 덜컹 막히네요;
제가 생각하는 or 이 아닌가봐요; 첨부파일의 소스를 보니 if문을 쓰신것 같기도 하던데...머엉...
좀 더 첨부파일을 연구해 보겠습니다.
profile

[레벨:30]아별

2011.12.02 11:30:15
*.104.126.21

음..

a = Int((8 * Rnd) + 1) Or Chr(Int(25 * Rnd + 65))

or연산자는 논리값을 리턴합니다.

A or B는 A또는 B가 True일경우 True를 리턴합니다. 둘다 False이면 False를 리턴하구요..

 

이럴땐.. IF를 사용해야합니다.

If "조건" Then "true일경우" Else "false일경우"

"true일경우"나 "false일경우"의 실행코드가 1주일경우는 IIF를 사용합니다.

IIF("조건","True일경우","False일경우")

 

저는 조건을 Rnd * 10 Mod 2로 사용했습니다.

0~10사이의 값을 2로 나눈 나머지로 0또는 1을 결과값으로 갖습니다.

Rnd함수를 사용했으니까.. 실행할때마다 랜덤으로 0또는 1이 나오겠죠..

조건문에서 0은 False이고, 0이 아닌 숫자는 True로 인식합니다. 즉 1은 True죠..

 

변수들 형식을 String으로 변경하고.. 숫자를 문자로 바꾸는 CStr함수를 활용했습니다.

기존의 Rnd의 배수 설정이 틀려서.. 수정했습니다.

Int((상한값 - 하한값 + 1) * Rnd + 하한값)

 

 

Sub 울트라()
    Dim i As Long
    Dim a As String, b As String, c As String, d As String
    Dim e As String, f As String, g As String, h As String
    Randomize (1)
    For i = 1 To 100
        a = IIf(Rnd * 10 Mod 2, CStr(Int((9 * Rnd) + 1)), Chr(Int(26 * Rnd + 65)))
        b = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        c = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        d = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        e = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        f = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        g = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        h = IIf(Rnd * 10 Mod 2, CStr(Int((10 * Rnd) + 0)), Chr(Int(26 * Rnd + 65)))
        Cells(i, 2) = (a & b & c & d & e & f & g & h)
        Next i
End Sub

 

 

 

 

문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 공지 [공지] 아별닷컴의 엑셀 질문방 폐쇄합니다. 카페 질문방 이용하세요.. imagefile [레벨:30]아별 2015-04-23 40235
362 피벗테이블 엑셀 데이터 정리관련 문의~~~ [2] [레벨:2]flash 2011-12-30 2704
361 엑셀일반 엑셀 줄 간격에 대해서 [1] [레벨:3]빛의행운아 2011-12-28 8873
360 VBA 동적 데이터 교환 질문 [1] [레벨:3]바람 2011-12-27 2777
359 차트 피라미드 그래프 (그림 첨부) file [5] [레벨:3]읍내꽃미남 2011-12-16 3886
358 엑셀일반 신입 주제에 질문 먼저라 죄송합니다 ㅠㅠ file [3] [레벨:1]에봉이 2011-12-09 2817
357 VBA 아별님 안녕하세요 질문이 하나 있습니다 ^^ file [3] [레벨:0]하이버리 2011-12-09 2677
356 엑셀일반 2010 엑셀로 작업 2003엑셀 시트 복사가 안되요 [1] [레벨:2]리자딘 2011-12-09 3682
355 엑셀일반 질문하나 더 드립니다! [1] [레벨:4]나카타 2011-12-09 2660
354 엑셀수식 엑셀 작업 중, 질문사항! - 다중 조건의 합계 산출 방법(SUMIFS,SUMPRODUCT) [2] [레벨:4]나카타 2011-12-08 2856
353 아별툴관련질문 스타일 삭제 질문입니다. imagefile [1] [레벨:0]blueclip 2011-12-07 3211
352 아별툴관련질문 sheet 통합하기 file [1] [레벨:2]광택입니다 2011-12-06 2682
351 엑셀일반 혹시 이런것도 가능한가요? (간결한 2가지 질문) - VBA만 실행파일(.exe)로 만들 수 있는지 여부, 외부 파일명 일괄 변경 방법.. [2] [레벨:6]파이스 2011-12-02 4000
» VBA 랜덤 출력 관련 짧고 간결(?)한 3가지 질문입니다. _ 중복 없는 랜덤 패스워드 생성하는 방법.. [4] [레벨:6]파이스 2011-11-29 6493
349 엑셀일반 매번 불편한 부분이 있어서 질문드립니다. _ 여러 행 또는 열을 한번에 삽입하는 방법.. [4] [레벨:4]알랑알랑♥ 2011-11-29 5402
348 배열수식 데이타 정열관련 질문 드립니다. _ offset과 배열 수식을 이용하여 최근 값을 순차적으로 갖고 오는 방법.. file [3] [레벨:1]바람길 2011-11-28 3661
347 엑셀일반 질문...^^ _ 선택 영역에서 빈셀만 모두 선택하여 특정 문자로 채우는 방법 [3] [레벨:4]나카타 2011-11-28 3774
346 VBA 갑자기 궁금해서 질문드리는건데요... _ VBA를 다른 오피스 프로그램에서 사용 가능한지..? [3] [레벨:6]파이스 2011-11-27 3137
345 VLookup 두개의 셀을 비교하여 같은값없애는 방법 file [3] [레벨:1]ak 2011-11-25 5334
344 VBA 2개의 시트를 비교하여 다른 부분을 찾아내는 프로시저 질문입니다! file [3] [레벨:6]파이스 2011-11-24 4791
343 VBA 아별님 안녕하세요? 파이스입니다. _ 엑셀창과 VBE창 창전환 쉽게 하는 방법 [3] [레벨:6]파이스 2011-11-23 3436