2024年6月29日土曜日

Excelのひな形に  ・指定の日付  ・宛名と住所電話番号、取引先コード  を 入れて名前を付けて保存する(ループで人数分)

Excelのひな形に

 ・指定の日付

 ・宛名と住所電話番号、取引先コード

 を 入れて名前を付けて保存する(ループで人数分)

 ※名簿はCSVで保存されている

 ※あたらしいブックに保存する際はSavePath & "\" & SaveName &とし

  指定のフォルダに保存させている

 ※フォルダ構成は以下の画像の通り 

  //名簿.csvは各フォルダには存在せず親フォルダに存在する

 


 

 //雑感:本当はListbook1で選択した人だけファイルを作る

     というロジックを考えていたのだが、複数選択可能な

     Listboxの選択項目自体を配列とすることは

     私の実力では不可能だった。

     というわけで、とりあえずグループ全員分をつくり

     いらないものは手動で消すという方法とした。

     ここが心残りでした。


 参考画像:...作成ボタンを押すと以下のコードが発動するしくみ。

  


     

Private Sub CommandButton2_Click()

'??書の作成

Dim myPath, mySubPath, YearFolder As String

Dim Filename, ListBox1 As String

Dim bk As Workbook

Dim myDay As String

Dim wbNew As String

 

'On Error Resume Next


 

 '自身以外のworkbooksを閉じる

  For Each bk In Workbooks

    If Not (bk Is ThisWorkbook) Then

      bk.Close SaveChanges:=False

    End If

  Next





myPath = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") - 1) & "\"  '親パスのフルパス

'myPath = ThisWorkbook.Path & "\" '自分自身のフルパス



mySubPath = myPath & "請求書-ひな形" & "\"



Filename = UserForm1.ComboBox3 & ".xls"


If UserForm1.ComboBox3 = "" Then


 MsgBox "様式を選択してください"


 Exit Sub


Else



Workbooks.Open mySubPath & Filename

ActiveWindow.SelectedSheets.Copy

wbNew = ActiveWorkbook.Name





End If


Dim flag As Boolean


 flag = False


Dim trgtFileName As String

trgtFileName = myPath & "\" & "名簿.csv"


' ワークブックオブジェクトを定義する

Dim wb As Workbook

'開いている全ブックにループ処理を実行する

For Each wb In Workbooks

'    ブックの名前が目的のブック名と一致した場合、処理を実行

    If wb.Name = trgtFileName Then

'        フラグをTrueにしてループを抜ける

        flg = True

        Exit For

    End If

Next


'フラグがFalseだった場合、ブックを開く

If flg = False Then

    Workbooks.Open trgtFileName

End If


Set wb = Nothing



'invoiceday----


Dim myDayStr, ggg, e, mm, dd As String


myDay = Format(Date, "gggemmdd")

myDayStr = CStr(myDay)


ggg = StrConv(Left(myDay, 2), vbWide)

e = StrConv(Mid(myDay, 3, 1), vbWide)

mm = StrConv(Mid(myDay, 5, 1), vbWide)

dd = StrConv(UserForm1.ComboBox4.Value, vbWide)



invoiceday = ggg & "      " & e & "年" & "      " & mm & "月" & "       " & dd & "日"



'--------------


Dim LastRow As Integer

Dim MyRange As Range

Dim FirstCell As Range

Dim Str As String

Dim myFind, SavePath, SaveName As String


LastRow = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row

SavePath = myPath & "2024-Excel" & "\" & UserForm1.ComboBox2.Value & "月"



SaveName = Format(Date, "yyyy") & "年" & UserForm1.ComboBox2.Value & "月" & " " & "??書 "



myFind = UserForm1.ComboBox3.Value


Set MyRange = ActiveWorkbook.Worksheets(1).Range(Cells(1, 5), Cells(LastRow, 8)).Find(what:=myFind, LookAt:=xlPart)



If MyRange Is Nothing Then


Debug.Print "みつかりません"


Exit Sub



 Else




        Set FirstCell = MyRange



    End If


    Do


'        Str = Str & Cells(MyRange.Row, 1).Value & Cells(MyRange.Row, 2).Value & Cells(MyRange.Row, 3).Value & Cells(MyRange.Row, 4).Value & vbLf



        Workbooks(wbNew).Activate


        With ActiveWorkbook.Worksheets(1)


         Range("N2").Value = Workbooks("名簿.csv").Worksheets(1).Cells(MyRange.Row, 4).Value 'T_no

         Range("M4").Value = invoiceday

         Range("O6").Value = Workbooks("名簿.csv").Worksheets(1).Cells(MyRange.Row, 2).Value 'Adress

         Range("O7").Value = Workbooks("名簿.csv").Worksheets(1).Cells(MyRange.Row, 3).Value 'tel

         Range("O8").Value = Workbooks("名簿.csv").Worksheets(1).Cells(MyRange.Row, 1).Value 'name


         Peopele = Workbooks("名簿-外注費.csv").Worksheets(1).Cells(MyRange.Row, 1).Value


        End With


         ActiveWorkbook.SaveAs SavePath & "\" & SaveName & Left(Peopele, 2) & ".xlsx"

         ActiveWorkbook.Close

         Workbooks(2).Activate

         ActiveWindow.SelectedSheets.Copy

         wbNew = ActiveWorkbook.Name


        Workbooks(3).Activate

        MyRange.Select



        Set MyRange = Cells.FindNext(MyRange)


        If FirstCell.Address = MyRange.Address Then Exit Do


    Loop


'    Debug.Print Str



'自身以外のworkbooksを閉じる

  For Each bk In Workbooks

    If Not (bk Is ThisWorkbook) Then

      bk.Close SaveChanges:=False

    End If

  Next


Set bk = Nothing

Set myPath = Nothing

Set mySubPath = Nothing

YearFolder = ""

Filename = ""

 myDay = ""

 wbNew = ""

myDayStr = ""

 ggg = ""

 e = ""

 mm = ""

 dd = ""

 myDay = ""

 myDayStr = ""

 LastRow = 0

Set MyRange = Nothing

Set FirstCell = Nothing

Set myFind = Nothing

SavePath = ""

SaveName = ""



Unload Me


End Sub

2024年(可変可能)フォルダを探して、さらに1月...12月のサブフォルダを作るVBA

’フォルダ作成ダブり処理に関わるエラートラップあり  


Sub MakeMonthFolder()


Dim myArrayMonth(12) As Variant

Dim i As Integer

Dim Filename As String

Dim myYear As Integer

Dim myPath, mySubPath, YearFolder As String



'myPath = Left(ThisWorkbook.path, InStrRev(ThisWorkbook.path, "\") - 1) & "\"

myPath = ThisWorkbook.path & "\"



YearFolder = CVar(Left(Date, 4)) + 1 '+1次年度、-1前年度


mySubPath = myPath & YearFolder & "-Excel" & "\"


 

'  Debug.Print mySubPath

 

For i = 1 To 12  

 myArrayMonth(i) = i & "月"


  If Dir(mySubPath & "\" & myArrayMonth(i), vbDirectory) = "" Then


  MkDir (mySubPath & "\" & myArrayMonth(i))


Else


' Debug.Print myPath & mySubPath & myArrayMonth(i) & ",フォルダの存在を確認しました"


Exit Sub


 End If

'

Next i


End Sub

2024年6月24日月曜日

値渡しでCombobox4.に日付を「今日から31まで」でAddItemとする



Private Sub ComboBox2_Change()

Dim Month As Integer


Month = UserForm1.ComboBox2.Value


Call LeapYear(Month)


End Sub


Private Sub LeapYear(Month As Integer)

Dim ComboBox4 As Integer

Dim myArray() As Long

Dim i As Integer



UserForm1.ComboBox4.Clear


ReDim myArray(31)



Dim thisDay As Date

Dim myDay As String

Dim LngDay As Long



thisDay = Format(Date, "yyyy/mm/dd")

myDay = Mid(CStr(thisDay), 9, 2)

LngDay = CLng(myDay)



 

 Select Case Month


 Case 1, 3, 5, 7, 8, 10, 12



 For i = 0 To 31

 

  myArray(i) = LngDay + i

  

   If myArray(i) > 31 Then

   

   Exit Sub

   

   Else

   

    UserForm1.ComboBox4.AddItem myArray(i)

  

  End If

  

 

  Next i



   UserForm1.ComboBox4.AddItem myArray(i)

   

 Case 4, 6, 9, 11

 

 

 For i = 0 To 30

 

  myArray(i) = LngDay + i

  

   If myArray(i) > 30 Then

   

   Exit Sub

   

   Else

   

    UserForm1.ComboBox4.AddItem myArray(i)

  

   End If

 

  Next i

 

 


 Case Else


 For i = 0 To 28

 

  myArray(i) = LngDay + i

  

   If myArray(i) > 28 Then

   

   Exit Sub

   

   Else

   

    UserForm1.ComboBox4.AddItem myArray(i)

 

  End If

 

  Next i

End Select


End Sub



雑感:作った後に考えました。「書類をためる人」という吾人がいらっしゃることを
   半年前の話なんて困りますよー という...
   やっぱり日付は1-31が都合がいいかな。

雑感2:31日まで、30日まで、28日まで、うるう年29日まで。
    日付は4つのバリエーションがあります。
    の後ほど考えます

2024年6月22日土曜日

うるう年判定VBA 2001年から2100年は大丈夫でした

 Sub うるう年判定()


 Dim Num As Integer

 Dim div_4, div_100, div_400 As Integer

 Dim odd_4, odd_100, odd_400 As Currency

  

  Num = 2100 ’ここに年を手入力

    

  div_4 = Num / 4

  odd_4 = Int(Num / 4)

  

  div_100 = Num / 100

  odd_100 = Int(Num / 100)

  

  div_400 = Num / 400 Mod 1

  odd_400 = Int(Num / 400)

  

 If div_400 - odd_400 = 0 Or div_100 - odd_100 = 0 Then

 

  

  Debug.Print Num & "年はうるう年ではありません、2月28日までです" & div_400 & "," & odd_400 & "," & "400"

    

 Else

  

  If div_4 - odd_4 = 0 Then

  

  Debug.Print Num & "年はうるう年で2月29日があります" & div_4 & "," & odd_4 & "," & "4"

  

  Exit Sub

  

 Else

 

  Debug.Print Num & "年はうるう年で2月29日があります" & div_4 & "," & odd_4 & "," & "other"

  Exit Sub

  

  End If

  

  End If


  

  

End Sub


2024年6月3日月曜日

ExcelファイルをPDFファイルに自動変換するVBA

 #Excelファイル を #pdfに自動変換 する #VBAをつくれないだろうかな、と思って作成。簡易的なものなのでエラーテストを十分していないのでご利用は自己責任です。

できてうれしいので公開ときます。ネット上のvba職人さん方々に敬意を表して。

Sub pdf作成()
Dim myPath As String
Dim FileInt As Long
Dim SetPath As String
Dim myFilename As String

Application.DisplayAlerts = False '
myPath = ThisWorkbook.Path
FileInt = 0
SetPath = Dir(myPath & "\" & "*.xls")
Do While SetPath <> ""
FileInt = FileInt + 1

Workbooks.Open Filename:=ThisWorkbook.Path & "\" & SetPath
myFilename = Left(SetPath, Len(SetPath) - 4)

ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & myFilename, OpenAfterPublish:=False
ActiveWorkbook.Close

SetPath = Dir()
Loop
Application.DisplayAlerts = True

End Sub


最終稿:
Sub pdf作成() Dim myPath As String Dim FileInt As Long Dim SetPath As String Dim myFilename As String Dim OriginalPath, OriginalPathName As String On Error Resume Next Application.DisplayAlerts = False myPath = ThisWorkbook.Path FileInt = 0 SetPath = Dir(myPath & "\" & "*.xls") OriginalPath = ThisWorkbook.Name OriginalPathName = Left(OriginalPath, Len(OriginalPath) - 4) Do While SetPath <> "" FileInt = FileInt + 1 Workbooks.Open Filename:=ThisWorkbook.Path & "\" & SetPath myFilename = Left(SetPath, Len(SetPath) - 4) If myFilename = OriginalPathName Then Exit Sub Else End If Debug.Print OriginalPathName ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & myFilename, OpenAfterPublish:=False ActiveWorkbook.Close SetPath = Dir() Loop Application.DisplayAlerts = True End Sub

後日談:Do while文つかっているのだから、IF分を中に噛ませないでDowhileの条件で
    大丈夫じゃないか?とおもったのですが、実際やってみるとうまくいかないんです。
    こういうお手盛りなところが基本設計がよろしくないというところで
    しかしいまのところこの程度のことしかできない... ご笑納ください

Git-Hub