오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴
퀵VBA 강의

서버 없이 엑셀 데이터를 SQL로 관리하는 획기적인 방법

오빠두엑셀 by 오빠두엑셀
  • 학습시간 25분
  • 난이도 고급
  • 작성일 2021.04.07

복잡한 SQL 서버 설정, 관리 없이 엑셀 안에서 VBA 명령문으로 관계형 데이터베이스를 구축하고 관리하는 방법

이 강의에서는 SQL 서버 없이 엑셀 매크로 DB 함수만으로 관계형 데이터베이스를 구축하는 방법을 다룹니다. 100만 행 이하의 데이터를 다루는 실무 환경에서 Get_DB·Connect_DB·Filtered_DB·Insert_Record·Update_Record·Delete_Record 명령문의 사용법과 적용 시 고려해야 할 제한 사항을 함께 정리합니다.

서버 없이 엑셀 데이터를 SQL로 관리하는 획기적인 방법
DOWNLOADS

실습자료를 준비했어요

수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇

실습 가이드

SQL(Structured Query Language)은 관계형 데이터베이스를 관리하기 위한 표준 질의 언어로, 전 세계 데이터베이스의 60% 이상이 SQL 기반으로 운영되며 그 비중은 꾸준히 확대되고 있습니다. 나머지 약 40%는 MongoDB와 같은 NoSQL 형태로 관리됩니다.

엑셀 데이터 베이스 사용 비중

이번 강의에서는 SQL 자체의 기능을 깊게 다루는 대신, "엑셀↔SQL 연동"과 "매크로 DB 함수 사용"의 차이점과 각 방식의 장단점을 하나씩 살펴봅니다.

매크로 DB 함수를 사용하면 무엇이 좋나요?

일반 실무자가 SQL 서버를 직접 구축하고 데이터를 관리하기란 결코 쉬운 일이 아닙니다. 최근에는 구글 클라우드 플랫폼(GCP), 아마존 웹 서비스(AWS), 애저(Azure) 등 SQL 서버를 손쉽게 구축할 수 있는 클라우드 플랫폼이 다양하게 제공되고 있지만, 매월 발생하는 유지비를 고려하면 러한 플랫폼을 사용하는 것 또한 일반 실무자에게는 부담이 될 수밖에 없습니다.

엑셀 데이터베이스 GCP AWS AZURE

전담 IT 부서가 없는 중소기업에서는 이러한 한계가 더욱 분명하게 드러납니다. SQL 서버를 자체적으로 운영하기 어려운 상황에서 데이터 관리 프로그램까지 자체 개발해야 하는 시점에 어려움이 본격적으로 시작됩니다. 비용과 일정에 제한이 있어 대부분의 과정을 자체 개발해야 하는데, 백엔드(서버단)와 프런트엔드(사용자단)를 모두 제어하는 프로그램을 구축하기란 결코 간단하지 않습니다.

이런 상황에서 가장 현실적으로 고려할 수 있는 방법이 바로 엑셀 매크로 DB 함수를 활용하는 것입니다. 특히 예상되는 데이터베이스 크기가 100만 행 이하라면, 이번 강의에서 소개하는 매크로 DB 함수만으로도 누구나 엑셀 안에서 관계형 데이터베이스를 구축하고 손쉽게 관리 프로그램을 제작할 수 있습니다.

  • IT 부서가 없는 중소기업에서 매월 수만 행 단위의 데이터가 누적되며 프로그램을 직접 개발하기에는 비용·시간적으로 제약이 있는 경우
  • ERP 프로그램에서 다운로드한 정규화된 엑셀 자료를 손쉽게 관리할 수 있는 프로그램이 필요한 경우
  • 여러 사용자가 동시에 접근하는 경우가 드물고, 관리할 데이터가 100만 행 이하로 예상되는 경우

다만 도입이 쉬운 만큼 사전에 검토해야 할 부분도 있습니다. 매크로 DB 함수와 엑셀↔SQL 연동의 주요 차이를 정리하면 아래 표와 같습니다.

항목 매크로 DB 함수 엑셀↔SQL 연동
레코드 개수(행 개수) 1,048,576 행 이하 무제한
동시 편집 동시 편집 불가능 동시 편집 가능
처리 속도 보통 (100만 행 처리 시 약 1초 내외, 실무에서 사용하기에 무리 없는 수준) 매우 빠름 (지연 시간 거의 없음)
보안 취약 (파일 안에 데이터가 그대로 저장되므로 보안에 취약) 우수 (서버에 데이터를 저장하며 IP 단위 접근 권한 설정 가능)
개발 난이도 백엔드와 프런트엔드 모두 비교적 쉽게 개발 가능 백엔드: ODBC 라이브러리로 엑셀↔SQL 연동, SQL 쿼리에 대한 이해 필요
프런트엔드: 비교적 쉽게 개발 가능
코드 안정성 엑셀 2010 이후 버전에서 안정적으로 동작 SQL 및 윈도우 버전에 따라 오류가 발생할 수 있으며, 버전이 달라질 때마다 코드 수정이 필요
관리 수준 DB 개수가 10개 이상이면 관리 난이도가 올라감. 데이터 구조에 대한 전반적인 이해만 갖추면 손쉽게 관리 가능. DB 개수에 상관없이 안정적으로 관리 가능. SQL에 대한 기본 지식 필요.

엑셀 매크로 DB 함수 사용 시 주의사항

이번 강의에서 소개하는 매크로 DB 함수는 실무에서 마주하는 대부분의 상황에 적용할 수 있습니다. 매크로 DB 함수를 활용하면 매우 빠르고 편리하게 엑셀 기반 프로그램을 제작하고 보완할 수 있습니다. 다만 위 표에서 정리한 것처럼, 아래 두 가지 제한 사항은 반드시 사전에 확인해 주세요.

  • 매크로 DB 함수는 1,048,576 행 이하의 데이터에서만 사용 가능합니다. (* 파워쿼리·파워피벗으로 만든 데이터 모델을 ODBC로 불러와 활용할 수도 있으나, 그 경우에는 파워쿼리·파워피벗을 사용하는 것보다 SQL을 활용하는 편이 훨씬 효율적입니다.)
  • 매크로 DB 함수는 엑셀 파일을 직접 참조하므로 여러 사용자가 동시에 편집·수정할 수 없습니다. (* 별도의 통합 문서를 참조하더라도, 엑셀은 동일한 통합 문서를 동시에 열 수 없으므로 동시 편집·수정이 불가능합니다.)

매크로 DB 함수를 활용한 실전 예제는 아래 재고 관리 프로그램 만들기 영상 강의에서 확인하실 수 있습니다.

매크로 DB 함수 전체 명령문

Option Explicit
Option Compare Text
'########################
' 특정 워크시트에서 앞으로 추가해야 할 최대 ID번호 리턴 (시트 DB 우측 첫번째 머릿글)
' i = Get_MaxID(Sheet1)
'########################
Function Get_MaxID(WS As Worksheet) As Long
With WS
    Get_MaxID = .Cells(1, .Columns.Count).End(xlToLeft).Value
    .Cells(1, .Columns.Count).End(xlToLeft).Value = .Cells(1, .Columns.Count).End(xlToLeft).Value + 1
End With
End Function
'########################
' 워크시트에 새로운 데이터를 추가해야 할 열번호 반환
' i = Get_InsertRow(Sheet1)
'########################
Function Get_InsertRow(WS As Worksheet) As Long
With WS:    Get_InsertRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1: End With
End Function
'########################
' 시트의 열 개수 반환 (이번 예제파일에서만 사용)
' i  = Get_ColumnCnt(Sheet1)
'########################
Function Get_ColumnCnt(WS As Worksheet, Optional Offset As Long = -1) As Long
With WS:    Get_ColumnCnt = .Cells(1, .Columns.Count).End(xlToLeft).Column + Offset: End With
End Function
'########################
' 시트에서 특정 ID 의 행 번호 반환 (-> 해당 행 번호 데이터 업데이트)
' i = get_UpdateRow(Sheet1, ID)
'########################
Function get_UpdateRow(WS As Worksheet, ID)
Dim i As Long
Dim cRow As Long
With WS
    cRow = Get_InsertRow(WS) - 1
    For i = 1 To cRow
        If .Cells(i, 1).Value = ID Then get_UpdateRow = i: Exit For
    Next
End With
End Function
 
'########################
' 특정 시트의 DB 정보를 배열로 반환 (이번 예제파일에서만 사용)
' Array = Get_DB(Sheet1)
'########################
Function Get_DB(WS As Worksheet, Optional NoID As Boolean = False, Optional IncludeHeader As Boolean = False) As Variant
 
Dim cRow As Long
Dim cCol As Long
Dim offCol As Long
 
If NoID = False Then offCol = -1
 
With WS
    cRow = Get_InsertRow(WS) - 1
    cCol = Get_ColumnCnt(WS, offCol)
    Get_DB = .Range(.Cells(2 + Sgn(IncludeHeader), 1), .Cells(cRow, cCol))
End With
 
End Function
 
'########################
'특정 시트에서 지정한 ID의 필드 값 반환 (이번 예제파일 전용)
' Value = Get_Records(Sheet1, ID, "필드명")
'########################
Function Get_Records(WS As Worksheet, ID, Fields)
 
Dim cRow As Long: Dim cCol As Long
Dim vFields As Variant: Dim vField As Variant
Dim vFieldNo As Variant
Dim i As Long: Dim j As Long
 
cRow = Get_InsertRow(WS) - 1
cCol = Get_ColumnCnt(WS)
 
If InStr(1, Fields, ",") > 0 Then vFields = Split(Fields, ",") Else vFields = Array(Fields)
ReDim vFieldNo(0 To UBound(vFields))
 
With WS
    For Each vField In vFields
        For i = 1 To cCol
            If .Cells(1, i).Value = Trim(vField) Then vFieldNo(j) = i: j = j + 1
        Next
    Next
 
    For i = 2 To cRow
        If .Cells(i, 1).Value = ID Then
            For j = 0 To UBound(vFieldNo)
                vFieldNo(j) = .Cells(i, vFieldNo(j))
            Next
            Exit For
        End If
    Next
 
Get_Records = vFieldNo
 
End With
 
End Function
 
'########################
' 시트에 새로운 레코드 추가 (반드시 첫번째 값은 ID, 나머지 값 순서대로 입력)
' Insert_Record Sheet1, ID, 필드1, 필드2, 필드3, ..
'########################
Sub Insert_Record(WS As Worksheet, ParamArray vaParamArr() As Variant)
 
Dim cID As Long
Dim cRow As Long
Dim vaArr As Variant: Dim i As Long: i = 2
 
With WS
    cRow = Get_InsertRow(WS)
    If InStr(1, .Cells(1, 1).Value, "ID") > 0 Then
        cID = Get_MaxID(WS)
        .Cells(cRow, 1).Value = cID
        For Each vaArr In vaParamArr
            .Cells(cRow, i).Value = vaArr
            i = i + 1
        Next
    Else
        For Each vaArr In vaParamArr
            .Cells(cRow, i - 1).Value = vaArr
            i = i + 1
        Next
    End If
 
End With
 
End Sub
'########################
' 시트에서 ID 를 갖는 레코드의 모든 값 업데이트 (반드시 첫번째 값은 ID여야 하며, 나머지 값을 순서대로 입력)
' Update_Record Sheet1, ID, 필드1, 필드2, 필드3, ...
'########################
Sub Update_Record(WS As Worksheet, ParamArray vaParamArr() As Variant)
 
Dim cRow As Long
Dim i As Long
Dim ID As Variant
 
If IsNumeric(vaParamArr(0)) = True Then ID = CLng(vaParamArr(0)) Else ID = vaParamArr(0)
 
With WS
    cRow = get_UpdateRow(WS, ID)
 
    For i = 1 To UBound(vaParamArr)
        If Not IsMissing(vaParamArr(i)) Then .Cells(cRow, i + 1).Value = vaParamArr(i)
    Next
 
End With
 
End Sub
'########################
' 시트에서 ID 를 갖는 레코드 삭제
' Delete_Record Sheet1, ID
'########################
Sub Delete_Record(WS As Worksheet, ID)
 
Dim cRow As Long
 
If IsNumeric(ID) = True Then ID = CLng(ID)
 
With WS
    cRow = get_UpdateRow(WS, ID)
    .Cells(cRow, 1).EntireRow.Delete
End With
 
End Sub
 
'########################
' 배열의 외부ID키 필드를 본 시트DB와 연결하여 해당 외부ID키의 연관된 값을 배열로 반환
' Array = Connect_DB(Get_DB(Sheet1),2,Sheet2, "필드1, 필드2, 필드3")
'########################
Function Connect_DB(DB As Variant, ForeignID_Fields As Variant, FromWS As Worksheet, Fields As String, Optional IncludeHeader As Boolean = False)
 
Dim cRow As Long: Dim cCol As Long
Dim vForeignID_Fields As Variant: Dim vForeignID_Field As Variant
Dim ForeignID As Variant
Dim vFields As Variant: Dim vField As Variant
Dim vID As Variant: Dim vFieldNo As Variant
Dim Dict As Object
Dim i As Long: Dim j As Long
Dim AddCols As Long
 
cRow = UBound(DB, 1)
cCol = UBound(DB, 2)
If InStr(1, Fields, ",") > 1 Then
    AddCols = Len(Fields) - Len(Replace(Fields, ",", "")) + 1
    vFields = Split(Fields, ",")
Else
    AddCols = 1
    vFields = Array(Fields)
End If
 
ReDim Preserve DB(1 To cRow, 1 To cCol + AddCols)
 
Set Dict = Get_Dict(FromWS)
vID = Dict("ID")
 
ReDim vFieldNo(0 To UBound(vFields))
 
For Each vField In vFields
    For i = 1 To UBound(vID)
        If vID(i) = Trim(vField) Then vFieldNo(j) = i: j = j + 1
    Next
Next
 
If InStr(1, ForeignID_Fields, ",") > 0 Then vForeignID_Fields = Split(ForeignID_Fields, ",") Else vForeignID_Fields = Array(ForeignID_Fields)
 
For Each vForeignID_Field In vForeignID_Fields
    For i = 1 To cRow
        If IncludeHeader = True And i = 1 Then ForeignID = "ID" Else ForeignID = DB(i, Trim(vForeignID_Field))
        If Dict.Exists(ForeignID) Then
            For j = 1 To AddCols
                DB(i, cCol + j) = Dict(ForeignID)(vFieldNo(j - 1))
            Next
        End If
    Next
Next
 
Connect_DB = DB
 
End Function
'########################
' 특정 배열에서 Value를 포함하는 레코드만 찾아 다시 배열로 반환
' Array = Filtered_DB(Array, "검색값", False)
'########################
Function Filtered_DB(DB, Value, Optional FilterCol, Optional ExactMatch As Boolean = False) As Variant
 
Dim cRow As Long
Dim cCol As Long
Dim vArr As Variant: Dim s As String: Dim filterArr As Variant:  Dim Cols As Variant: Dim Col As Variant: Dim Colcnt As Long
Dim isDateVal As Boolean
Dim vReturn As Variant: Dim vResult As Variant
Dim Dict As Object: Dim dictKey As Variant
Dim i As Long: Dim j As Long
Dim Operator As String
 
Set Dict = CreateObject("Scripting.Dictionary")
 
If Value <> "" Then
    cRow = UBound(DB, 1)
    cCol = UBound(DB, 2)
    ReDim vArr(1 To cRow)
    For i = 1 To cRow
        s = ""
        For j = 1 To cCol
            s = s & DB(i, j) & "|^"
        Next
        vArr(i) = s
    Next
 
    If IsMissing(FilterCol) Then
        filterArr = vArr
    Else
        Cols = Split(FilterCol, ",")
        ReDim filterArr(1 To cRow)
        For i = 1 To cRow
            s = ""
            For Each Col In Cols
                s = s & DB(i, Trim(Col)) & "|^"
            Next
            filterArr(i) = s
        Next
    End If
 
    '수정 Or Left(Value, 2) = "<>" 추가
    If Left(Value, 2) = ">=" Or Left(Value, 2) = "<=" Or Left(Value, 2) = "=>" Or Left(Value, 2) = "=<" Or Left(Value, 2) = "<>" Then
        Operator = Left(Value, 2)
        If IsDate(Right(Value, Len(Value) - 2)) Then isDateVal = True
    ElseIf Left(Value, 1) = ">" Or Left(Value, 1) = "<" Then
        Operator = Left(Value, 1)
        If IsDate(Right(Value, Len(Value) - 1)) Then isDateVal = True
    Else: End If
 
    If Operator <> "" Then
        If isDateVal = False Then
            Select Case Operator
                Case ">"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) > CDbl(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case "<"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) < CDbl(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn Next Case ">=", "=>"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) >= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case "<=", "=<"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case "<>"
                    If ExactMatch = False Then
                        For i = 1 To cRow
                            If Not (filterArr(i) Like "*" & Right(Value, Len(Value) - 2) & "*") Then
                                vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                                vReturn = Split(vArr(i), "|^")
                                Dict.Add i, vReturn
                            End If
                        Next
                    Else
                        For i = 1 To cRow
                            If Not (filterArr(i) Like Right(Value, Len(Value) - 2) & "|^") Then
                                vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                                vReturn = Split(vArr(i), "|^")
                                Dict.Add i, vReturn
                            End If
                        Next
                    End If
            End Select
        Else
            Select Case Operator
                Case ">"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) > CDate(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case "<"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) < CDate(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn Next Case ">=", "=>"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) >= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                 Case "<=", "=<"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn Next End Select End If Else If ExactMatch = False Then For i = 1 To cRow If filterArr(i) Like "*" & Value & "*" Then vArr(i) = Left(vArr(i), Len(vArr(i)) - 2) vReturn = Split(vArr(i), "|^") Dict.Add i, vReturn End If Next Else For i = 1 To cRow If filterArr(i) Like Value & "|^" Then vArr(i) = Left(vArr(i), Len(vArr(i)) - 2) vReturn = Split(vArr(i), "|^") Dict.Add i, vReturn End If Next End If End If If Dict.Count > 0 Then
        ReDim vResult(1 To Dict.Count, 1 To cCol)
        i = 1
        For Each dictKey In Dict.Keys
            For j = 1 To cCol
                vResult(i, j) = Dict(dictKey)(j - 1)
            Next
            i = i + 1
        Next
    End If
 
    Filtered_DB = vResult
Else
    Filtered_DB = DB
End If
 
End Function
 
'########################
' 특정 시트의 DB 정보를 Dictionary로 반환 (이번 예제파일에서만 사용)
' Dict = GetDict(Sheet1)
'########################
Function Get_Dict(WS As Worksheet) As Object
 
Dim cRow As Long: Dim cCol As Long
Dim Dict As Object
Dim vArr As Variant
Dim i As Long: Dim j As Long
 
Set Dict = CreateObject("Scripting.Dictionary")
 
With WS
    cRow = Get_InsertRow(WS) - 1
    cCol = Get_ColumnCnt(WS)
 
    For i = 1 To cRow
        ReDim vArr(1 To cCol - 1)
        For j = 2 To cCol
            vArr(j - 1) = .Cells(i, j)
        Next
        Dict.Add .Cells(i, 1).Value, vArr
    Next
End With
 
Set Get_Dict = Dict
 
End Function

Get_DB 함수

Get_DB 함수 구문
Dim DB As Variant
DB = Get_DB ( 시트, [ID없음], [머릿글포함] )

Get_DB 함수는 시트에 입력된 데이터를 배열로 반환하는 함수입니다. 데이터를 범위 대신 배열로 받아오면 처리 속도가 빨라질 뿐만 아니라, 이후 가공 과정에서도 다양한 이점을 얻을 수 있습니다.

Get_DB 함수가 참조하는 시트의 데이터는 반드시 아래 규칙에 맞게 작성되어야 합니다.

엑셀 GET_DB 함수 사용법

  1. 데이터는 A1셀에서 시작합니다.
  2. 머릿글은 1행에 1줄로 작성합니다.
  3. 병합된 셀이 없어야 합니다.
  4. ID(고유값)이 있을 경우, 반드시 첫번째 열에 입력되어야 하며 DB 오른쪽으로 신규 ID가 입력된 셀이 있어야 합니다.

Get_DB 함수를 사용하면 시트에 입력된 데이터가 배열로 반환되며, 반환된 배열은 Connect_DB 함수(관계 생성), Filtered_DB 함수(필터링), ArrayToRng 함수(범위 출력) 등에서 그대로 활용할 수 있습니다.

Get_DB 명령문 사용예제
Sub Get_DB_Test()
 
Dim DB As Variant
 
DB = Get_DB(ThisWorkbook.Worksheets("주문상세"))
'주문상세 시트에 입력된 데이터를 배열로 반환합니다.
End Sub

Connect_DB 함수

Connect_DB 함수 구문
Dim DB As Variant
DB = Get_DB ( 시트, [ID없음], [머릿글포함] )
DB = Connect_DB ( DB, ID번호, 연결할시트, 불러올필드, [머릿글포함] )

Connect_DB 함수는 기존 배열의 ID를 참조하여 다른 시트와 연결된 DB를 생성하는 함수입니다. 예를 들어 [급여내역]에 입력된 직원 ID를 참조하여 [급여내역]–[직원정보]가 연결된 관계형 DB를 만들거나, [매출내역]의 제품 ID를 참조하여 [매출내역]–[제품정보]가 연결된 관계형 DB를 구성할 수 있습니다.


Connect_DB 함수로 연결되는 시트의 데이터는 Get_DB 함수와 동일한 규칙으로 작성되어야 합니다. 연결할 시트는 반드시 ID 열을 포함해야 하며, ID는 반드시 첫 번째 열에 위치해야 합니다.

Connect_DB 명령문 사용예제
Option Explicit
 
Sub Connect_DB_Test()
 
Dim DB As Variant
 
DB = Get_DB(ThisWorkbook.Worksheets("주문상세"))
'주문상세 시트에 입력된 데이터를 배열로 반환합니다.
 
DB = Connect_DB(DB, 2, ThisWorkbook.Worksheets("주문목록"), "주문번호,생성시간")
'주문상세 시트 2번째 열에 입력된 주문ID를 참조하여 주문목록시트에서 주문번호와 생성시간 데이터를 연결합니다.
 
End Sub

Filtered_DB 함수

Filtered_DB 함수 구문
Dim DB As Variant
DB = Get_DB ( 시트, [ID없음], [머릿글포함] )
DB = Filtered_DB ( DB, 조건, [열번호], [일치옵션] )

Filtered_DB 함수는 입력한 조건에 따라 배열을 필터링하여 결과 배열을 반환하는 함수입니다. Filtered_DB에는 한 번에 하나의 조건만 입력할 수 있으므로, 동일한 DB에 여러 조건을 적용해야 한다면 Filtered_DB 함수를 여러 번 사용합니다.

Filtered_DB 명령문 사용예제
Sub Filtered_DB_Test()
 
Dim DB As Variant
 
DB = Get_DB(ThisWorkbook.Worksheets("주문상세"))
'주문상세 시트에 입력된 데이터를 배열로 반환합니다.
 
DB = Filtered_DB(DB, ">=" & 20000, 5)
'주문상세 시트의 5번째 열(가격)이 20000 이상인 항목만 필터링합니다.
 
End Sub

Insert_Record 함수

Insert_Record 함수 구문
Dim WS As Worksheet
Set WS = ThisWorkbook.Worksheets("고객명")
Insert_Record WS, "값1", "값2", "값3", ...

Insert_Record 함수는 시트에 새로운 레코드를 추가하는 함수입니다.


Insert_Record 함수로 새로운 레코드가 추가되는 시트의 데이터는 아래 규칙을 지켜 관리해야 합니다.

Insert_Record 예제

  1. 데이터는 A1셀에서 시작합니다.
  2. 머릿글은 1행에 1줄로 작성합니다.
  3. 병합된 셀이 없어야 합니다.
  4. ID(고유값)이 있을 경우, 반드시 첫번째 열에 입력되어야 하며 DB 오른쪽으로 신규 ID가 입력된 셀이 있어야 합니다.
  5. 고유값이 있을 경우, 고유값의 머릿글은 반드시 "ID"라는 문자를 포함해야 합니다. ID가 연속된 숫자일 경우 데이터의 오른쪽으로 새롭게 추가될 ID 순번을 같이 관리해야 합니다.
Insert_Record 명령문 사용예제
Sub Insert_Record_Test()
 
Dim WS As Worksheet
 
Set WS = ThisWorkbook.Worksheets("고객명")
Insert_Record WS, "ABC", "김하늘", "010-1234-1234", "서울시 강남구 대치동", Date
'고객명 시트에 새로운 고객정보를 추가합니다.
 
End Sub

Delect_Record 함수

Delete_Record 함수 구문
Dim WS As Worksheet
Set WS = ThisWorkbook.Worksheets("고객명")
Delete_Record WS, ID, [행번호여부], [ID열]

Delete_Record 함수는 시트에 입력된 레코드를 삭제하는 함수입니다.


행번호여부 인수를 TRUE로 설정하면 ID 대신 행 번호를 참조하여 레코드를 삭제합니다. ID열 인수에 열 번호를 입력하면 지정한 열에서 ID를 찾아 해당 레코드를 삭제하며, 별도로 지정하지 않으면 첫 번째 열을 기준으로 ID를 검색합니다.

Delete_Record 명령문 사용예제
Sub Delete_Record_Test()
 
Dim WS As Worksheet
 
Set WS = ThisWorkbook.Worksheets("고객명")
Delete_Record WS, 4
'고객명 시트에서 ID가 4인 고객정보를 삭제합니다.
 
End Sub

Update_Record 함수

Update_Record 함수 구문
Dim WS As Worksheet
Set WS = ThisWorkbook.Worksheets("고객명")
Update_Record WS, ID, "값1", "값2", "값3", ...

Update_Record 함수는 시트에 입력된 데이터베이스에서 지정한 ID를 찾아 해당 레코드의 값을 갱신하는 함수입니다. ID는 반드시 데이터의 첫 번째 열에 위치해야 합니다.


ID에 중복값이 있을 경우, Update_Record 함수는 위에서부터 처음으로 일치하는 레코드 하나만 찾아 값을 업데이트합니다.

Update_Record 명령문 사용예제
Sub Update_Record_Test()
 
Dim WS As Worksheet
 
Set WS = ThisWorkbook.Worksheets("고객명")
Update_Record WS, 4, "APPLE", "이민수", "010-1234-1234", "서울시 강남구 대치동", Date
'고객명 시트에서 ID가 4인 고객정보를 갱신합니다.
 
End Sub
댓글 20
4.9 (14개 평가)
namo
namo 2021.04.07 20:24
멋집니다
정탁영
정탁영 2021.04.08 08:29
감사합니다
taemui
taemui 2021.04.08 21:46
디테일까지 쭉 달려주세요 ㅠ 너무 너무 응용하고 싶어요 ㅠ
브라더태
브라더태 2021.06.09 06:31
재고 관리 강의는 언제쯤??
오빠두엑셀
오빠두엑셀 작성자 2021.06.09 16:01
안녕하세요.
재고관리 툴 만들기 강의는 현재 위캔두 멤버여러분께만 제공해드리고 있습니다.
아래 링크를 확인해보세요. :)
https://www.oppadu.com/%ec%97%91%ec%85%80-live-26%ea%b0%95/
무료 강의는 편집이 완료되는대로 순차적으로 업로드 예정입니다.
감사합니다.
김영실
김영실 2021.07.03 10:15
이 부분 제일 궁금하고 배우고 싶었던 부분인데, 강의가 있었네요! E-BOOK 다운 받아서 열심히 공부해볼게요!! 늘 많이 도움 받고 있습니다.
한강괴물
한강괴물 2021.07.19 12:15
이거 꼭 마스터 해서 업무 더 편하게 하고 말겠습니다
승승2
승승2 2021.11.02 16:23
감사합니다
mik
mik 2021.11.11 12:52
SQL 쿼리를 이용한 배열방식 엑셀을 좀 더 보고싶은데요. 정확한 명칭이 맞는지 모르겠습니다. ㅜㅠ
지금 강의가 전체일까요?
아니면 회원가입을 하면 더 많은 강의를 들을 수 있는건가요?
오빠두엑셀
오빠두엑셀 작성자 2021.11.11 20:02
mik 님 안녕하세요?^^
아래 라이브 전체 영상
https://www.oppadu.com/%ec%97%91%ec%85%80-live-24%ea%b0%95/
또는 재고관리 만들기 전체 강의를 확인해보시겠어요?
https://www.oppadu.com/%ec%97%91%ec%85%80-%ec%9e%ac%ea%b3%a0%ea%b4%80%eb%a6%ac-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8/
감사합니다.
팔도강산
팔도강산 2021.11.26 08:41
강의도 내용도 목표도 대단하십니다. 감사합니다.
jhoon****
jhoon**** 2022.01.24 14:01
filter 조건에서 빈셀을 제외한 이라는 조건을 걸수 있을까요 ?
오빠두엑셀
오빠두엑셀 작성자 2022.01.25 21:02
jhoon 님 안녕하세요.
얼마전 Filtered_DB 함수를 제외조건 필터링이 가능하도록 수정하였습니다.
https://www.oppadu.com/vba-filtered-db-%ed%95%a8%ec%88%98/
수정된 명령문으로 코드를 아래와 같이 사용해보시겠어요?^^
DB = Filtered_DB(DB,"<>",열번호,True)
그러면 빈칸 제외조건으로 필터가 적용됩니다. 감사합니다.