안녕하세요, 엑셀 사용자 여러분!
오늘은 VBA를 사용해 Excel에서 반복문을 구현하는 방법에 대해 알아보겠습니다.
반복문은 프로그래밍에서 정말 중요한 개념인데요, Excel VBA에서도 이를 활용하면 작업 효율을 크게 높일 수 있답니다.

먼저 반복문이 뭔지, 그리고 왜 필요한지 간단히 살펴보고 Excel VBA에서 사용할 수 있는 여러 종류의 반복문을 하나씩 알아보겠습니다. 코드 예제도 함께 보여드릴 테니 따라해보시면 금방 익숙해지실 거예요!

      1. 반복문이란?
        반복문은 특정 작업을 여러 번 반복해서 실행하고 싶을 때 사용하는 프로그래밍 구조입니다. 예를 들어, 엑셀 시트의 100개 셀에 같은 작업을 적용하고 싶다면 반복문을 사용하면 됩니다. 이렇게 하면 코드를 100번 작성하는 대신 몇 줄로 간단히 처리할 수 있죠.

      2.  Excel VBA의 주요 반복문
        Excel VBA에서는 주로 세 가지 유형의 반복문을 사용합니다:
        • For...Next
        • Do...Loop
        • For Each...Next
        각각의 특징과 사용법을 자세히 알아볼까요?

      3. For...Next 반복문
        For...Next 반복문은 특정 횟수만큼 코드를 반복할 때 사용합니다. 시작 값과 끝 값을 지정하고, 그 사이의 모든 값에 대해 코드를 실행하는 방식이죠.
        For 변수 = 시작값 To 끝값 [Step 증가값]
            '반복할 코드
        Next 변수
        간단한 예제를 볼까요?
        A열의 1부터 10까지의 셀에 숫자를 채우는 코드입니다.
        Sub FillNumbers()
            Dim i As Integer
            
            For i = 1 To 10
                Cells(i, 1).Value = i
            Next i
        End Sub

        이 코드를 실행하면 A1부터 A10까지 1부터 10까지의 숫자가 채워집니다.
        Step을 사용하면 증가 값을 변경할 수 있어요.
        예를 들어, 짝수만 채우고 싶다면 아래와 같이 작성하면 됩니다.
        Sub FillEvenNumbers()
            Dim i As Integer
            
            For i = 2 To 20 Step 2
                Cells(i / 2, 1).Value = i
            Next i
        End Sub
        이 코드는 A1부터 A10까지 2, 4, 6, ..., 20을 채웁니다.

      4. Do...Loop 반복문
        Do...Loop 반복문은 특정 조건이 만족될 때까지 코드를 반복합니다. 조건을 먼저 검사하고 싶으면 'Do While' 또는 'Do Until'을, 코드를 실행한 후 조건을 검사하고 싶으면 'Do...Loop While' 또는 'Do...Loop Until'을 사용합니다.

        기본 구조는 이렇습니다.
        Do While 조건
            '반복할 코드
        Loop
        
        ' 또는
        
        Do
            '반복할 코드
        Loop While 조건
        예를 들어, 사용자가 "그만"이라고 입력할 때까지 계속 입력을 받는 코드를 만들어볼까요?
        Sub GetUserInput()
            Dim userInput As String
            Dim row As Integer
            
            row = 1
            
            Do
                userInput = InputBox("값을 입력하세요. ('그만'을 입력하면 종료)")
                If userInput <> "그만" Then
                    Cells(row, 1).Value = userInput
                    row = row + 1
                End If
            Loop Until userInput = "그만"
        End Sub
        이 코드는 사용자가 "그만"을 입력할 때까지 계속해서 입력을 받아 A열에 순서대로 기록합니다.
      5. For Each...Next 반복문
        For Each...Next 반복문은 컬렉션이나 배열의 각 요소에 대해 작업을 수행할 때 유용합니다. 특히 Excel에서 선택한 범위의 모든 셀을 처리할 때 자주 사용됩니다.

        기본 구조는 이렇습니다.
        For Each 요소 In 컬렉션
            '반복할 코드
        Next 요소

        선택한 범위의 모든 셀 값을 2배로 만드는 예제를 볼까요?
        Sub DoubleValues()
            Dim cell As Range
            
            For Each cell In Selection
                If IsNumeric(cell.Value) Then
                    cell.Value = cell.Value * 2
                End If
            Next cell
        End Sub
        이 코드를 실행하기 전에 원하는 범위를 선택하세요.
        그러면 선택한 범위 내의 모든 숫자 값이 2배가 됩니다.

      6. 중첩 반복문
        때로는 반복문 안에 또 다른 반복문을 넣어야 할 때가 있습니다. 이를 중첩 반복문이라고 하는데요, 예를 들어 2차원 배열이나 표를 다룰 때 유용합니다.

        A1:E5 범위에 곱셈표를 만드는 예제로 중첩 반복문을 살펴볼까요?
        Sub MultiplicationTable()
            Dim row As Integer
            Dim col As Integer
            
            For row = 1 To 5
                For col = 1 To 5
                    Cells(row, col).Value = row * col
                Next col
            Next row
        End Sub
        이 코드를 실행하면 A1:E5 범위에 1부터 5까지의 곱셈표가 만들어집니다.

      7. 반복문 제어하기
        때로는 반복문을 중간에 멈추거나 다음 반복으로 넘어가고 싶을 때가 있습니다.
        이럴 때 사용하는 키워드가 있어요.
        • Exit For / Exit Do: 반복문을 즉시 종료하고 빠져나갑니다.
        • Continue For / Continue Do: 현재 반복을 중단하고 다음 반복으로 넘어갑니다.
        예를 들어, 1부터 100까지의 숫자 중 3의 배수만 출력하되, 50을 넘으면 멈추는 코드를 만들어볼까요?
        Sub PrintMultiplesOfThree()
            Dim i As Integer
            Dim row As Integer
            
            row = 1
            
            For i = 1 To 100
                If i Mod 3 = 0 Then
                    Cells(row, 1).Value = i
                    row = row + 1
                    
                    If i > 50 Then
                        Exit For
                    End If
                End If
            Next i
        End Sub
        이 코드는 A열에 3, 6, 9, ..., 48까지만 출력하고 멈춥니다.

      8. 성능 고려사항
        반복문을 사용할 때는 성능에 주의를 기울여야 합니다. 특히 큰 데이터셋을 다룰 때 그렇죠. 여기 몇 가지 팁을 소개해드릴게요:
        • 가능하면 For Each 문을 사용하세요. Range 객체와 함께 사용할 때 일반적으로 가장 빠릅니다.
        • 셀을 자주 읽거나 쓸 때는 배열을 사용하세요. 워크시트와의 상호작용을 줄이면 성능이 크게 향상됩니다.
        • Application.ScreenUpdating = False를 사용해 화면 업데이트를 끄면 속도가 빨라집니다. 작업이 끝나면 다시 True로 설정하는 걸 잊지 마세요.
        큰 범위의 합계를 구하는 예제로 이 팁들을 적용해볼까요?
        Sub SumLargeRange()
            Dim data As Variant
            Dim total As Double
            Dim i As Long, j As Long
            
            Application.ScreenUpdating = False
            
            ' A1:Z1000 범위의 데이터를 배열로 읽어옵니다
            data = Range("A1:Z1000").Value
            
            ' 배열의 모든 요소를 더합니다
            For i = 1 To UBound(data, 1)
                For j = 1 To UBound(data, 2)
                    If IsNumeric(data(i, j)) Then
                        total = total + data(i, j)
                    End If
                Next j
            Next i
            
            ' 결과를 AA1 셀에 출력합니다
            Range("AA1").Value = total
            
            Application.ScreenUpdating = True
        End Sub
        이 방식은 각 셀에 직접 접근하는 것보다 훨씬 빠르게 동작합니다.



        끝!

        지금까지 Excel VBA에서 반복문을 사용하는 방법에 대해 알아보았습니다.
        For...Next, Do...Loop, For Each...Next 등 다양한 반복문의 사용법과 예제를 살펴보았고,
        중첩 반복문과 반복문 제어 방법, 그리고 성능 향상을 위한 팁까지 다뤘습니다.

        반복문은 VBA 프로그래밍의 핵심 요소 중 하나입니다.
        처음에는 어려워 보일 수 있지만, 연습을 통해 익숙해지면 엑셀 작업의 효율성을 크게 높일 수 있답니다.
        이 글에서 소개한 예제들을 직접 따라해보고, 여러분의 실제 업무에 적용해보세요.
      1. VBA를 배우는 과정이 때로는 도전적일 수 있지만,
        한 걸음 한 걸음 나아가다 보면 어느새 복잡한 작업도 쉽게 자동화할 수 있는 실력을 갖추게 될 거예요.
        궁금한 점이 있다면 언제든 질문해주세요. 함께 배우고 성장해 나가요!

        엑셀 VBA로 더 효율적인 업무 환경을 만들어가는 여러분을 응원합니다.
        다음에 또 다른 유용한 VBA 팁으로 찾아뵐게요. 그때까지 즐겁고 생산적인 엑셀 라이프 되세요!
Posted by 샌츠
,

나중을 위한 기록.

 

1. 카메라에서 로우포맷을 체크하고 포맷하기.

2. magiclantern-Nightly.2018Dec24.70D112 파일 전체를 메모리 카드에 복사하기.

3.EOS card 프로그램으로 카메라에서 부팅가능한 메모리로 만들기.

 

Strings 체크박스 2개를 체크하고 Save만 누르면 됨!

끝!.

'DSLR-70D' 카테고리의 다른 글

아이파이, 무선 SD 카드 모비 프로 출시 "RAW 파일 전송"  (0) 2015.09.01
캐논 EOS 유틸리티  (0) 2015.08.31
Posted by 샌츠
,

기록을 위해 작성.

커밋을 하려다가 기존 내용의 커밋 내용을 수정하고자 하는 부분이 생겨 수정 후 

커밋 하려 했던 코드들을 커밋하려하니 아래와 같은 에러가 발생하였다.

 

영어를 별로 좋아하지 않아 대충 보고, 다시하면 되겟지 하였다가 되지 않아 구글링 하였고 

영어를 다시 보니 프로세스 보호를 위해  index.lock 파일을 생성하며 커밋에 락이 걸린듯 하다.

Please make sure all processes are terminated then try again. If it still fails,
a git process may have crashed in this repository earlier:
remove the file manually to continue.

해결방법 1. 해당 리파지토리 내부에 .git 폴더에 들어가서 index.lock 를 삭제.

해결방법 2. git Bash를 사용한다면 아래의 명령어를 입력.

rm -f ./.git/index.lock

Posted by 샌츠
,

- gitHub의 용량 제한은 100M. 초과시 에러가 발생하며 Push가 되지 않음.

 

  • 해결방법

   1. bfg 다운로드
      링크 : https://rtyley.github.io/bfg-repo-cleaner/

 

BFG Repo-Cleaner by rtyley

$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git an alternative to git-filter-branch The BFG is a simpler, faster alternative to git-filter-branch for cleansing bad data out of your Git repository history: Removing Crazy Big Files Re

rtyley.github.io

2. 레파지토리 폴더에 bfg 파일 복사

3. git Bash 실행

4. [ java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 100M ] 명령어 입력

4-1. 실패시 출력문구

4-2. [ git repack && git gc ] 명령어 입력

4-3. 위와같은 메세지가 출력되엇다면 다시 [ java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 100M ] 명령어 입력

 

5. 위와 같은 메세지가 출력되엇다면. 다시 Push 하기!

'Git' 카테고리의 다른 글

[Sourcetree] 여러 계정 이용시 인증 에러 해결 방법  (0) 2024.04.24
Posted by 샌츠
,

 TryParse 메서드

입력한 문자열이 숫자로 변환할 수 있는 문자열인지 체크하여 
숫자로 변환이 가능하다면 True, 문자등이 포함되어 있어서 숫자로 변환이 불가능한다면 False를 반환한다.

 

  • 아래는 가단하게 테스트 해볼 수 있는 코드
using System;

namespace StringConversion
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("숫자를 입력해주세요: ");
            if (int.TryParse(Console.ReadLine(), out int intInput))
                Console.WriteLine(intInput);
            else
                Console.WriteLine("{0} : 입력한 값을 다시 확인해주세요.");

            // 프로그램이 종료되지 않도록 추가
            Console.WriteLine("프로그램을 종료하려면 아무 키나 누르세요...");
            Console.ReadLine(); //엔터 키를 누를 때까지 대기.
        }
    }
}

'C#' 카테고리의 다른 글

[C#] 메인폼에서 다른폼 열기  (0) 2024.04.26
[C#] 파일 다운로드기능  (0) 2024.01.05
[C#] 버튼 일괄 숨기기 / 보이기  (0) 2023.11.23
Posted by 샌츠
,

메인폼의 메뉴에서 다른 서브폼을 열었을때, 가장 기본적인 코드로 폼을 열어보면 서브창만 움직일 수 있고

메인폼은 움직일 수가 없다.

using System;
using System.Windows.Forms;

namespace Namespace
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            //폼을 생성하고 보여줍니다.
            frmSub subForm = new frmSub();
            subForm.ShowDialog(); // 모달 다이얼로그로 표시합니다.
        }
    }

    public partial class frmSub : Form
    {
        public frmSub()
        {
            InitializeComponent();
        }
    }
}

 

아래의 코드는 메뉴의 버튼을 눌렀을때, 서브폼이 팝업되고 메인폼도 제어가 가능한 코드이다.

그리고 sub폼이 열린 상태에서 메뉴의 버튼을 다시 한번 누르면 에러가 발생한다.

이것을 방지하기 위해서는 subForm이 실행되엇는지 체크하면 된다.

using System;
using System.Windows.Forms;

namespace Namespace
{
    public partial class MainForm : Form
    {
        private frmSub subForm; // frmSub 폼의 인스턴스를 보관할 멤버 변수 선언

        public MainForm()
        {
            InitializeComponent();
        }

        private void menuButton_Click(object sender, EventArgs e)
        {
            if (subForm == null || subForm.IsDisposed)
            {
                // frmSub 폼이 없거나 이미 닫혔다면 새로 생성.
                subForm = new frmSub();
                subForm.FormClosed += (s, args) => subForm = null; // 폼이 닫힐 때 참조를 제거.
            }

            if (!subForm.Visible)
            {
                subForm.Show(this); // MainForm의 소유자로 frmSub 폼을 표시.
            }
        }
    }

    public partial class frmSub : Form
    {
        public frmSub()
        {
            InitializeComponent();
        }
    }
}

'C#' 카테고리의 다른 글

[C#] 문자열을 숫자로 변환  (0) 2024.05.23
[C#] 파일 다운로드기능  (0) 2024.01.05
[C#] 버튼 일괄 숨기기 / 보이기  (0) 2023.11.23
Posted by 샌츠
,

새 노트북을 구매하고 새롭게 개발 환경을 세팅하고 

github의 리포지토리를 Sourcetree에 처음 연동할때엔 잘 되었던 것으로 기억하고 있었는데,

어제 갑자기 인증 오류가 발생하였다.

오류는 다음과 같다

remote: Support for password authentication was removed on August 13, 2021.
Please use a personal access token instead.

내용을 보면 몇년전이라는데, 왜 나는 잘 되다가 이제야 발생한 것인진 잘 모르겠다.

해결방법

- 인터넷을 찾아보니 여러 방법들이 있었는데, 한참을 고생하고 나서야 해결 할 수 있었다.

그런데 그 방법이 인터넷의 정보와는 조금 달라, 나중을 위하여 블로그에 남기고자 한다.

1. 토큰 생성

    - 깃허브에 로그인 후 Setting 메뉴로 들어간다.

1-1. 좌측 메뉴 하단에 Developer Settings

1-2.Personal access tokens > Tokens(classic)

1-3. Generate new token > Generate new token (classic)

    - 패스워드 입력 필요

1-4.권한 설정

1-5. 토큰값 확인

2. 해당 토큰값을 Sourcetree에 적용하기

2-1. 소스트리에서 토큰을 적용하고자 하는 리포지토리를 선택후 설정 메뉴 접속

2-2. 보통 원격 저장소 정보의 경로는 다음과 같을 것이다.

https://github.com/repo/name.git

2-3. 위 경로의 주소를 다음과 같이 설정한다.

https://아이디:토큰값@github.com/repo/name.git

2-4. 그리고 추가 확장 통합의 Remote Account 에 Github 계정으로 인증을 한다.

( * 이부분은 월래 로그인이 되어 있어서 이번 오류에 영향이 있는지는 확인이 되진 않음)

 

 

위와 같이 작업을 할 경우 여러 리파지토리의 계정이 모두 달라도 해당 계정의 토큰을 할당 받으면  Patch, Pull, Push가 모두 정상 작동 한다.  끝.

'Git' 카테고리의 다른 글

[git] Push시 파일용량이 100M 초과시 에러 발생  (0) 2024.06.04
Posted by 샌츠
,

매뉴얼 다운로드 기능을 구현하기 위해 프로젝트 폴더에 매뉴얼 파일을 넣어두었다.

그리고 프로그램에서 매뉴얼 다운로드를 할 경우 프로젝트 폴더 안에 있는 매뉴얼을 여는 것이 아닌 

다운로드 폴더에 다운로드를 한 뒤에 열고자 한다.

다운로드를 하기 위해 사용해야 할 것은 ? File.Copy

try
    {
        string sourcePath = "path/to/your/Comprehensive Economic Index_Manual.pdf"; // Replace with the actual path
        string downloadsFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"\Downloads";
        string destPath = Path.Combine(downloadsFolder, "Comprehensive Economic Index_Manual.pdf");

        File.Copy(sourcePath, destPath, true); // Set to 'true' to overwrite if the file already exists

        // Optionally, if you want to inform the user
        MessageBox.Show("File downloaded to " + destPath);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        MessageBox.Show("Error in downloading the file: " + ex.Message);
    }

'C#' 카테고리의 다른 글

[C#] 문자열을 숫자로 변환  (0) 2024.05.23
[C#] 메인폼에서 다른폼 열기  (0) 2024.04.26
[C#] 버튼 일괄 숨기기 / 보이기  (0) 2023.11.23
Posted by 샌츠
,

여러 폼에 초기화 등의 버튼을 만들었을 경우.

메뉴에서 버튼을 클릭시 여러 폼에 있는 버튼들을 일괄로 숨기거나 보이는 기능을 만들어 보았다.

활용은 각자 알아서 .


클래스를 정의하고 각 폼에서 해당 버튼들을 클래스의 리스트변수에 담아두고 

메뉴버튼을 클릭시 해당 리스트에 담겨져 있는 버튼들의 Visible 상태값을 변경하는 코드이다.


  • 클래스정의
using System.Collections.Generic;
using System.Windows.Forms;

public class ButtonManager
{
    private static List<Button> controlButtons = new List<Button>();

    public static void RegisterButton(Button ctlButton)
    {
        controlButtons.Add(ctlButton);
    }

    public static void ToggleButtonsVisibility(bool showHideButtons)
    {
        foreach (Button ctlButton in controlButtons)
        {
            ctlButton.Visible = showHideButtons;
        }
    }
}

 

  • 각 파일 메인 함수
{
	InitializeComponent();
	BtnControlClass.ButtonManager.RegisterButton(ctlButton);
}

'C#' 카테고리의 다른 글

[C#] 문자열을 숫자로 변환  (0) 2024.05.23
[C#] 메인폼에서 다른폼 열기  (0) 2024.04.26
[C#] 파일 다운로드기능  (0) 2024.01.05
Posted by 샌츠
,

데이터그리드를 테스트해보기 위해 간단한 테스트 코드를 작성해보았다.

목표는 구글 스프레드시트와 연동하는것.

구글 api도 연동해야 하고 해야할 것은 많지만, 한걸음씩 :)

 

프로젝트 환경

  • Visual Studio 2022
  • WPF 애플리케이션
  • 프로젝트이름 : DataGridWPF_231117
  • 프레임워크 : .NET 7.0(표준 용어 지원)

 

MainWindow.xaml

<Window x:Class="DataGridWPF_231117.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridWPF_231117"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid x:Name="dataGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <!-- DataGridTextColumn을 사용하여 각 열을 정의합니다.
                Header 속성은 열의 헤더(제목)를 설정하고, Binding 속성을 통해 데이터 속성과 바인딩합니다. -->
                <DataGridTextColumn Header="이름" Binding="{Binding Name}" />
                <DataGridTextColumn Header="나이" Binding="{Binding Age}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

 

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace DataGridWPF_231117
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // 데이터 모델 클래스 정의
        private class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
        public MainWindow()
        {
            InitializeComponent();
            Loaded += dataGrid_init;
        }

        private void dataGrid_init(object sender, RoutedEventArgs e)
        {
            // 샘플 데이터 생성
            ObservableCollection<Person> people = new ObservableCollection<Person>
            {
                new Person { Name = "홍길동", Age = 30 },
                new Person { Name = "김철수", Age = 25 },
                new Person { Name = "이영희", Age = 28 },
            };

            // 데이터 그리드에 데이터 바인딩
            dataGrid.ItemsSource = people;
        }
    }
}

 

 

끝.

Posted by 샌츠
,