2014-10-15 2 views
0

이 시나리오를 고려하십시오. 서버에 두 개의 네트워크 공유가있는 클라이언트가 있습니다. 각 공유에는 각 프로젝트를 나타내는 동일한 폴더 목록이 있습니다 (하나는 현재 데이터 용이고 다른 하나는 보관 데이터 용입니다). 각 프로젝트 폴더에는 개별 권한이 할당되어 있어야하는 일치하는 폴더 및 하위 폴더 집합이 들어 있습니다. 물론 프로젝트는 때때로 추가되거나 제거됩니다.Excel에서 연결 For 루프 명령의 배치 파일 만들기

각 프로젝트 폴더 및 모든 하위 폴더에 대해 설정해야하는 권한 목록과 함께 Excel에서 프로젝트 목록을 유지 관리하고 싶습니다. 내 생각은 각 행이 하위 폴더를 나타내는 행마다 Excel에서 명령을 배치하는 것입니다. 그런 다음 for 루프를 사용하여 공유 폴더 및 프로젝트 폴더에 디렉토리 경로에 추가하는 명령을 복제하십시오. 출력은 변경하거나 업데이트해야하는 권한을 언제든지 실행할 수있는 배치 파일입니다.

편집 : Excel에서 VBA를 사용한 적이 없으며 검색 후 for 루프에서 변수를 사용하여 시트의 셀을 참조하는 방법을 변경하는 방법을 찾지 못하는 것 같습니다. 어떤 프로그램을 작성한 이후로 꽤 오래되었지만 C로 프로그래밍 할 때 for 루프의 변수를 사용하여 목록/테이블에서 참조 셀을 사용할 수 있음을 기억합니다. for 루프가 반복을 거치면서 변수는 참조하는 셀의 목록을 변경합니다. Excel 용어로 이것을 넣으려면 각 for 루프의 변수를 행 번호로 지정하고 각 반복마다 변경되지 않으므로 열 문자를 정적으로 할당합니다.

for 루프가 실행될 때마다 일련의 셀을 텍스트 파일의 새 줄에 출력되는 텍스트 문자열로 연결해야합니다. 연결은 각 루프 동안 동일하게 유지되는 일부 셀과 변수가 증가함에 따라 변경되는 다른 셀을 연결합니다. 예를 들어, 셀 A1, B1, Ci, Dj, E1, Fk를 연결하고자합니다. 여기서 i, j 및 k는 각 for 루프의 반복 횟수를 계산하는 데 사용되는 정수의 숫자 값을 나타냅니다.

가변 셀 할당을 사용하여 연결을 수행하는 올바른 구문을 알 수 있습니까? 여기 내 코드에서 발췌 한 내용이 있습니다.

For i = 2 To numberOfSharedFolders 

     'Loops for every subfolder (project folder) in the shared folder that needs permissions set 
     For j = 2 To numberOfSubfolders1 

      'Loops for every entry of permissions on final folders 
      For k = 2 To numberOfSubfolders2 

       concatenatedDataString = ActiveSheet.Range("A1") & ActiveSheet.Range("B1") & ActiveSheet.Range("C"i) & ActiveSheet.Range("D"j) 
       Write #1, concatenatedDataString 

      Next k 
     Next j 
    Next i 
+2

당신이 주요 질문을 요약 할 수 있나요? 빨래 목록의 질문은 코드 리뷰와 비슷하며 다른 사이트가 있으므로 Stackoverflow의 초점을 위해 개선해야합니다. –

+0

물론, 아론. Dave는 이미 많은 질문에 답했기 때문에 오늘 밤에 원본 게시물을 정리할 예정입니다. –

답변

0

을 나는이 모든 일이있어. 내 코드는 아래와 같습니다. 이것이하는 일에 대한 더 자세한 정보는 원래의 질문을 읽으십시오.

하위 Sheet1Compile()

'Create variables used in for loops 
Dim numberOfSharedFolders As Integer 
Dim numberOfSubfolders1 As Integer 
Dim numberOfSubfolders2 As Integer 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer 

'Set values of variables to the number of rows in each column. 
'Note that the value includes the column titles in row 1 
numberOfSharedFolders = ActiveSheet.Range("B2") 
numberOfSubfolders1 = ActiveSheet.Range("B3") 
numberOfSubfolders2 = ActiveSheet.Range("B4") 


'Create text file to output of data from for loop 
Dim filePath As String 
filePath = Application.DefaultFilePath & "\icacls Commands.txt" 
Open filePath For Output As #1 


'Loops for every row in the first mentioned column (except the first row which contains column labels) 
'Initializing to 2 instead of 1 so that the loop will skip the first row which is just column labels. Not setting it to 0 since there is no row 0 
For i = 2 To numberOfSharedFolders 

    'Loops for every row in the second mentioned column (except the first row which contains column labels) 
    For j = 2 To numberOfSubfolders1 

     'Loops for every row in the third mentioned column (except the first row which contains column labels) 
     For k = 2 To numberOfSubfolders2 

      'Print the concatendated text to the output file. Print is used instead of "write" so that it doesn't produce unwanted quotation marks. 
      Print #1, ActiveSheet.Cells(2, 3) & ActiveSheet.Cells(i, 4) & ActiveSheet.Cells(j, 5) & ActiveSheet.Cells(1, 6) & ActiveSheet.Cells(k, 7) & ActiveSheet.Cells(1, 8) & ActiveSheet.Cells(k, 9) 

     Next k 
    Next j 
Next i 

Close #1 

End Sub 
1

.B3ActiveSheet는 객체의 메소드 또는 속성 아니다.

나는 ActiveSheet.Range("B3")

더 오류가있을 수 있습니다 당신이 의도 의심, 실제로 다음 두 줄은 같은 오류가 발생 할 것으로 예상 할 수있다.

Appleication이 개체가 아니기 때문에이 문에서 오타가 424 개체 필요 오류를 발생시키는 것을주의하십시오. 빈 값으로 정의되지 않은/선언되지 않은 변수로 처리됩니다. 를 들어

filePath = Appleication.DefaultFilePath & "icacls Commands.bat" 

당신이 어떤 정의되지 않은 변수에 대한 컴파일 오류가 발생합니다 (오타에 대해 규제하기 위해 각 모듈의 상단에 Option Explicit을 사용할 수 있으며, 오타가 정의되지 않은 변수로 해석됩니다.

귀하의 질문의 나머지 부분 (실제로 당신은 상당히 광범위한 6 가지 질문을하고 있습니다) 간단히 답변하려고하지만 연장 된 질문 Q & A 또는 여기에있는 토론을 실제로 접대하지는 않습니다. 구체적인 질문이있는 경우 개별적으로 (검색/문제 해결/등에서 실사를 한 후에) 개별적으로 질문해야합니다.

정확히 for 루프에서 연결해야합니까?

무슨 뜻인지 모르겠다. 기존 문자열에 값을 추가하여 루프에서 연결합니다. + 연산자 대신 & 연산자를 사용하십시오. 후자는 문자열이 아닌 데이터로 혼동 될 수 있습니다. 즉, "hello" & 1은 오류를 발생시키지 않지만 "hello" +1은 불일치를 발생시킵니다.

concatenatedDataSting = i + j + k 

i, jk 모든 정수 데이터입니다 : 사실

Dim i as Integer 
Dim s as String 
s = "some words" 
For i = 1 to 10 

    s = s & some_other_variable 

Next 

, 당신의 코드는 단순히 추가 정수의 문자열을 연결하지 않습니다. 이것은 문자열을 생성하지 않습니다 (또는 문자열 인 경우 해당 연산의 숫자 합을 나타내는 강제/묵시적인 문자열입니다).

for 루프의 변수를 설정하는 더 좋은 방법이 있습니까? 현재 나는 countif (D : D, "*")를 사용하여 각 열의 크기를 합한 셀을 가지고 있으며 변수에 그 셀을 할당하고 있습니다.

변수는 무엇입니까? 위의 코드에서 D 열 또는 CountIf 함수에 대한 참조가 표시되지 않습니다.

시트의 데이터를 참조하는 가장 좋은 방법은 무엇입니까? 범위()? currentsheet.range()?

"시트의 데이터"가 의미하는 바에 따라 다릅니다. 불분명하고 대답 하기엔 너무 넓습니다.

이 프로그램을 어떻게 실행합니까? 개발자 콘솔에서 재생을 클릭하면

개발자 리본 매크로 메뉴에서 ThisWorkbook (또는 매크로가있는 책)에서 매크로를 선택하십시오. 그런 다음 실행하십시오. 또는 콘솔/VBE에서 F5 또는 "실행"단추를 누르십시오.

텍스트 파일이 어디로 끝날지 어떻게 알 수 있습니까? 기본 위치는 내 문서입니까?

Application.DefaultFilePath 

당신은 즉 위치를 확인하기 위해이 작업을 수행 할 수 있습니다 : 당신이 오타 수정하면

그것은 여기에 끝날 것 MsgBox Application.DefaultFilePath

+0

데비드, 도움을 요청해 주신데, 내가 묻고있는 것을 구체적으로 설명하는 것이 상당히 어려웠지만. 어젯밤 11시에 이런 편지를 쓰지 말았어야 했어. 그래서 나는 애매한 마음으로 시간 낭비를해서 유감이다. –

+0

여러분을 환영합니다. 이것이 당신의 즉각적인 문제를 해결했다면, 그것을 투표 또는 [답변 수령] (http://stackoverflow.com/help/accepted-answer)을 고려하십시오. 건배. –

+0

David, 나는 내 질문을 세련되게했다. 나 한테 다시 한번 주시겠습니까? –