db 배열안에 날자 데이터가 포함되어 있는데 바로 전에 가장 가까운 날자를 선택할수 있을까요?
안녕하세요
액셀 재고관리 툴 만들기 8시간 풀동영상 보면서 만들고
제가 원하는 기능이 있어서 바꿔보고 있습니다.
밑에 사진 보시면 db에 4번째 값이 날자 값입니다.
오늘이 11.25일이면 저 db 값중에서 바로 전 가장 가까운 날자를 필터링해서 빨간 네모의 값을 얻고 싶은데
아무리 짱구를 굴려봐도 답이 안나오네요
도움 부탁드립니다. ㅜㅜ
혹시 몰라 강좌에서 쓰인 get_db 함수하고 riltered_db 함수 밑에 포함합니다.
'########################
' 특정 시트의 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
==================================================================
'########################
' 특정 배열에서 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
If 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
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
번호 | 카테고리 | 제목 | 작성자 | 작성일 | 추천 | 조회 |
[🔥선착순 판매] 2023년 엑셀 공부, "8시간 로드맵"으로 마스터하세요! (6)
![]() ![]() |
![]() ![]() |
2023.01.25 | 6 | 2084 | ||
공지사항 | 공지사항 |
⭐ [더 나은 커뮤니티 문화를 위한 Q&A 글 작성 규칙] ⭐
(122)
오빠두엑셀
|
2021.10.28
|
추천 155
|
조회 9704
|
![]() ![]() |
2021.10.28 | 155 | 9704 |
48417 | 함수/공식 |
New 텍스트 결합 문의 및 데이터 표로 만들기 문의
![]() ![]() ![]() |
![]() |
20:33 | - | 6 |
48414 | 함수/공식 |
New 세로순서 검색 방법문의
![]() ![]() |
![]() |
19:20 | - | 10 |
48395 | 피벗테이블 |
New 누적 데이터를 피벗 테이블로 표시할 때 그 피봇 테이블 자체에 함수를 적용 할 수 있나요??
![]() |
![]() |
08:07 | - | 35 |
48388 | VBA |
New 특정한 폴더의 특정셀값만 불러올 수 있을까요?
![]() ![]() |
![]() |
01:17 | - | 34 |
48379 | 함수/공식 |
New 같은 수식으로 여러 시트에 있는 자료를 VLOOKUP으로 끌고 올 수 있을까요?
![]() ![]() |
![]() |
2023.01.28 | - | 33 |
48367 | 피벗테이블 |
New 피벗테이블 새로고침시 행높이 자동바뀜 현상 질문드립니다.
![]() ![]() ![]() |
![]() |
2023.01.28 | - | 32 |
48354 | 함수/공식 |
New 붙여 넣기 또는 자동채우기 작업 중 리소스 부족 에러
![]() |
![]() |
2023.01.28 | - | 24 |
48351 | 함수/공식 |
New 2개 이상의 조건이 부합 시 결제일별로 순번을 매기고 싶어요.
![]() ![]() ![]() |
![]() |
2023.01.28 | - | 41 |
48333 | 문서서식 |
New 강의 자료 다운로드시 한셀로 열립니다.
(2)
![]() |
![]() |
2023.01.28 | - | 49 |
48292 | 함수/공식 |
New 글자수 (byte) 자르기 질문입니다.
(1)
![]() |
![]() |
2023.01.27 | - | 31 |
48284 | 함수/공식 |
New 초보적인 질문이라고 생각합니다만 도움 부탁드러요
![]() ![]() ![]() |
![]() |
2023.01.27 | - | 47 |
48280 | 함수/공식 |
New countif 사용하면서, 배열 중 하나와 일치하면 카운트하는 방법은 없을까요?
(1)
![]() |
![]() |
2023.01.27 | - | 39 |
48278 | 문서서식 |
New 출장보고서 데이터 취합 및 분석을 위한 양식 문의건
![]() ![]() ![]() |
![]() |
2023.01.27 | - | 35 |
48276 | VBA |
New 워드 (docx) 파일을 형식 그대로 엑셀로 변환이 가능할까요?
![]() |
![]() |
2023.01.27 | - | 31 |
48272 | 함수/공식 |
New 서버에 있는 엑셀파일 참조 오류
(3)
![]() |
![]() |
2023.01.27 | - | 37 |
48267 | VBA |
New 실시간 데이터 값이 같을때 그 값을 어떻게 기록하나요?
![]() ![]() ![]() |
![]() |
2023.01.27 | - | 61 |
48257 | 대시보드 |
New 대시보드) 타임라인 생성 후, 연도/월/일로 자유롭게 보고 싶은데 그렇게 하다보면 그래프가 잘 안떠요.
![]() |
![]() |
2023.01.27 | - | 46 |
48253 | 함수/공식 |
New 2칸 건너서 총 합계 구하는 방법
![]() ![]() |
![]() |
2023.01.27 | - | 57 |
48249 | 함수/공식 |
New 이름에 맞춰 자동 조건에 맞는 텍스트가 써질 수 있게 하는 방법 문의
![]() ![]() ![]() |
![]() |
2023.01.27 | - | 55 |
48248 | VBA |
New vba 리스트박스 다중선택값을 column별로 각각의 텍스트박스로 받기.
![]() ![]() |
![]() |
2023.01.27 | - | 36 |
48247 | 함수/공식 |
New 평가 점수 관련 수식이 어렵습니다 도움부탁드립니다 !
![]() ![]() |
![]() |
2023.01.27 | - | 37 |
48245 | 함수/공식 |
New 정렬 관련 해결방법
(1)
![]() |
![]() |
2023.01.27 | - | 40 |
48243 | 함수/공식 |
New sum함수 뒤에 이어서 붙이라는데 모르겠어요.
![]() ![]() |
![]() |
2023.01.27 | - | 42 |
48242 | 차트/그래프 |
New 차트 값이 없을때 데이터레이블 없애는법
![]() ![]() |
![]() |
2023.01.27 | - | 28 |
48239 | 차트/그래프 |
New 간트차트에서 오차막대 서식 저장 문의
![]() |
![]() |
2023.01.27 | - | 35 |
48233 | VBA |
New S로 시작하는 엑셀파일을 여는 VBA 명령문
![]() ![]() |
![]() |
2023.01.27 | - | 45 |
48231 | 기능/도구 |
New 크롤링 할때 로그인 필요한 URL
(3)
답변완료
![]() |
![]() |
2023.01.27 | - | 58 |
48228 | 함수/공식 |
New countifs 로 4개 조건검색하기
![]() ![]() |
![]() |
2023.01.27 | - | 60 |
48222 | 함수/공식 |
New 중복된 값 제거 관련 문제(조건부 서식, 중복된 항목 제거 모두 안됩니다)
![]() ![]() |
![]() |
2023.01.27 | - | 53 |
48220 | 기능/도구 |
New 원하는 갯수만큼 값 넣는 방법
(3)
![]() |
![]() |
2023.01.27 | - | 55 |