Created
October 22, 2022 07:52
-
-
Save YujiFukami/00f7a81a578d0d4225af027292e400b2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'ClipStrToDimString ・・・元場所:IkiAddin.ModClipboard | |
'GetClipboardText ・・・元場所:IkiAddin.ModClipboard | |
'ClipArray ・・・元場所:IkiAddin.ModClipboard | |
'Lib入力配列を処理用に変換・・・元場所:IkiAddin.ModLibrary | |
'ClipboardCopy ・・・元場所:IkiAddin.ModClipboard | |
'文字列を変数格納用に変換 ・・・元場所:IkiAddin.ModClipboard | |
'ConcatenateStr ・・・元場所:IkiAddin.ModStr | |
'ShowCodeWindow ・・・元場所:IkiAddin.ModAlignmentCode | |
'SendKeysWSH ・・・元場所:IkiAddin.ModSendKey | |
'宣言セクション※※※※※※※※※※※※※※※※※※※※※※※※※※※ | |
'----------------------------------- | |
'元場所:IkiAddin.ModSendKey.PbwshShell | |
Public PbwshShell As Object | |
'宣言セクション終了※※※※※※※※※※※※※※※※※※※※※※※※※※※ | |
Public Sub ClipStrToDimString(Optional ByRef ValueName As String = "Str", _ | |
Optional ByRef Indent As Long = 4, _ | |
Optional ByRef DeleteFirstStr As String = "'") | |
'クリップボードに格納された文字列を、文字列を変数宣言するコードに変換して、クリップボードに再格納する | |
'20220223 | |
'紹介予定 | |
'引数 | |
'[ValueName] ・・・文字列を格納する変数名 | |
'[Indent] ・・・インデントの半角スペース個数 | |
'[DeleteFirstStr]・・・先頭文字を削除する場合のその先頭文字(省略なら「'」) | |
'クリップボードに格納された文字列を取得する | |
Dim ClipStr As String: ClipStr = GetClipboardText | |
'文字列を一次元配列に変換する | |
Dim StrArray1D As Variant | |
StrArray1D = Split(ClipStr, vbLf) | |
StrArray1D = WorksheetFunction.Transpose(WorksheetFunction.Transpose(StrArray1D)) | |
'変数格納用文字列に変換する | |
Dim ClipArray As Variant | |
ClipArray = 文字列を変数格納用に変換(ValueName, StrArray1D, Indent, DeleteFirstStr) | |
'クリップボードに再格納 | |
Call ClipboardCopy(ClipArray) | |
'コードウィンドウに戻る | |
Call ShowCodeWindow '20211223 | |
End Sub | |
Private Function GetClipboardText() | |
'クリップボードに格納中の文字列データを取得する | |
'Microsoft Forms 2.0 Object Libraryを参照 | |
'参考:http://officetanaka.net/excel/vba/tips/tips20.htm | |
'20210916 | |
Dim OutputStr As String | |
Dim Clip As New DataObject | |
With Clip | |
.GetFromClipboard | |
OutputStr = .GetText | |
End With | |
GetClipboardText = OutputStr | |
End Function | |
Private Sub ClipArray(ByVal InputArray As Variant, _ | |
Optional ByRef Message As Boolean = False) | |
'配列をクリップボードに格納して、セルにそのまま貼り付ける形にする。 | |
'20210930 | |
'引数 | |
'InputArray・・・配列(一次元、二次元どちらでも可能) | |
'[Message] ・・・処理後のメッセージを表示するかどうか(デフォルトはFalse) | |
'引数処理 | |
InputArray = Lib入力配列を処理用に変換(InputArray) '1スタートの二次元配列に変換する | |
'処理 | |
Dim I As Long | |
Dim J As Long | |
Dim N As Long: N = UBound(InputArray, 1) '縦要素数計算 | |
Dim M As Long: M = UBound(InputArray, 2) '横要素数計算 | |
Dim OutputStr As String: OutputStr = "" | |
For I = 1 To N | |
For J = 1 To M | |
If J = 1 Then | |
OutputStr = OutputStr & InputArray(I, J) | |
Else | |
OutputStr = OutputStr & Chr(9) & InputArray(I, J) 'タブで区切る | |
End If | |
Next J | |
If I < N Then | |
OutputStr = OutputStr & vbCrLf '改行追加 | |
End If | |
Next I | |
Call ClipboardCopy(OutputStr, Message) | |
End Sub | |
Private Function Lib入力配列を処理用に変換(InputHairetu) | |
'入力した配列を処理用に変換する | |
'1次元配列→2次元配列 | |
'数値か文字列→2次元配列(1,1) | |
'要素の開始番号を1にする | |
'20210721 | |
'20220304 変数の型変更 | |
'20220531 修正 | |
Dim Output As Variant | |
Dim I As Long | |
Dim M As Long | |
Dim N As Long | |
Dim Base1 As Long | |
Dim Base2 As Long | |
If IsArray(InputHairetu) = False Then | |
'配列でない場合(数値か文字列) | |
ReDim Output(1 To 1, 1 To 1) | |
Output(1, 1) = InputHairetu | |
Else | |
On Error Resume Next | |
M = UBound(InputHairetu, 2) | |
On Error GoTo 0 | |
If M = 0 Then | |
'1次元配列 | |
If UBound(InputHairetu, 1) = 1 Then '20220531修正 | |
ReDim Output(1 To 1, 1 To 1) | |
Output(1, 1) = InputHairetu(1) | |
Else | |
Output = WorksheetFunction.Transpose(InputHairetu) | |
End If | |
Else | |
'2次元配列 | |
Base1 = LBound(InputHairetu, 1) | |
Base2 = LBound(InputHairetu, 2) | |
If Base1 <> 1 Or Base2 <> 1 Then | |
N = UBound(InputHairetu, 1) | |
If N = Base1 Then | |
'(1,M)配列 | |
ReDim Output(1 To 1, 1 To M - Base2 + 1) | |
For I = 1 To M - Base2 + 1 | |
Output(1, I) = InputHairetu(Base1, Base2 + I - 1) | |
Next I | |
Else | |
Output = WorksheetFunction.Transpose(InputHairetu) | |
Output = WorksheetFunction.Transpose(Output) | |
End If | |
Else | |
Output = InputHairetu | |
End If | |
End If | |
End If | |
Lib入力配列を処理用に変換 = Output | |
End Function | |
Private Sub ClipboardCopy(ByVal InputClipText As Variant, _ | |
Optional ByRef Message As Boolean = False) | |
'入力テキストをクリップボードに格納 | |
'配列ならば列方向をTabわけ、行方向を改行する。 | |
'20210719作成 | |
'参考:http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30565154.html | |
'入力した引数が配列か、配列の場合は1次元配列か、2次元配列か判定 | |
Dim HairetuHantei As Long | |
Dim Jigen1 As Long | |
Dim Jigen2 As Long | |
If IsArray(InputClipText) = False Then | |
'入力引数が配列でない | |
HairetuHantei = 0 | |
Else | |
On Error Resume Next | |
Jigen2 = UBound(InputClipText, 2) | |
On Error GoTo 0 | |
If Jigen2 = 0 Then | |
HairetuHantei = 1 | |
Else | |
HairetuHantei = 2 | |
End If | |
End If | |
'クリップボードに格納用のテキスト変数を作成 | |
Dim Output As String | |
Dim I As Long | |
Dim J As Long | |
Dim M As Long | |
Dim N As Long | |
If HairetuHantei = 0 Then '配列でない場合 | |
Output = InputClipText | |
ElseIf HairetuHantei = 1 Then '1次元配列の場合 | |
If LBound(InputClipText, 1) <> 1 Then '最初の要素番号が1出ない場合は最初の要素番号を1にする | |
InputClipText = Application.Transpose(Application.Transpose(InputClipText)) | |
End If | |
N = UBound(InputClipText, 1) | |
Output = "" | |
For I = 1 To N | |
If I = 1 Then | |
Output = InputClipText(I) | |
Else | |
Output = Output & vbLf & InputClipText(I) | |
End If | |
Next I | |
ElseIf HairetuHantei = 2 Then '2次元配列の場合 | |
If LBound(InputClipText, 1) <> 1 Or LBound(InputClipText, 2) <> 1 Then | |
InputClipText = Application.Transpose(Application.Transpose(InputClipText)) | |
End If | |
N = UBound(InputClipText, 1) | |
M = UBound(InputClipText, 2) | |
Output = "" | |
For I = 1 To N | |
For J = 1 To M | |
If J < M Then | |
Output = Output & InputClipText(I, J) & Chr(9) | |
Else | |
Output = Output & InputClipText(I, J) | |
End If | |
Next J | |
If I < N Then | |
Output = Output & Chr(10) | |
End If | |
Next I | |
End If | |
'クリップボードに格納'参考 https://www.ka-net.org/blog/?p=7537 | |
With CreateObject("Forms.TextBox.1") | |
.MultiLine = True | |
.Text = Output | |
.SelStart = 0 | |
.SelLength = .TextLength | |
.Copy | |
End With | |
'格納したテキスト変数をメッセージ表示 | |
If Message Then | |
MsgBox ("「" & Output & "」" & vbLf & _ | |
"をクリップボードにコピーしました。") | |
End If | |
End Sub | |
Private Function 文字列を変数格納用に変換(ByRef ValueName As String, _ | |
ByRef StrArray1D As Variant, _ | |
Optional ByRef Indent As Long = 4, _ | |
Optional ByRef DeleteFirstStr As String = "'") _ | |
As Variant | |
'20220223 | |
'引数 | |
'ValueName ・・・文字列を格納する変数名 | |
'StrArray1D ・・・格納する文字が入った一次元配列 | |
'[Indent] ・・・インデントの半角スペース個数 | |
'[DeleteFirstStr]・・・先頭文字を削除する場合のその先頭文字(省略なら「'」) | |
Dim I As Long | |
Dim N As Long: N = UBound(StrArray1D, 1) | |
Dim Output As Variant: ReDim Output(1 To N + 1) | |
Dim AddCode As String | |
Output(1) = ConcatenateStr(String(Indent, " "), "Dim ", ValueName, " As String") | |
For I = 1 To N | |
AddCode = StrArray1D(I) | |
AddCode = Replace(AddCode, vbLf, "") '改行を消去 | |
AddCode = Replace(AddCode, vbCr, "") '改行を消去 | |
If InStr(AddCode, """") > 0 Then 'ダブルコーテーションは2回続ける | |
AddCode = Replace(AddCode, """", String(2, """")) | |
End If | |
If Mid(AddCode, 1, 1) = DeleteFirstStr And DeleteFirstStr <> "" Then '先頭文字の消去 | |
AddCode = Mid(AddCode, 2) | |
End If | |
If I < N Then | |
AddCode = ConcatenateStr("""", AddCode, """", " & VbLf") | |
Else | |
AddCode = ConcatenateStr("""", AddCode, """") | |
End If | |
Output(I + 1) = ConcatenateStr(String(Indent, " "), ValueName, " = ", ValueName, " & ", AddCode) | |
Next I | |
'出力 | |
文字列を変数格納用に変換 = Output | |
End Function | |
Private Function ConcatenateStr(ParamArray Str() As Variant) | |
'文字列を連結する | |
'20220215 | |
Dim StrList As Variant: StrList = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Str)) | |
Dim Output As String | |
Dim I As Long | |
Dim N As Long: N = UBound(StrList, 1) | |
For I = 1 To N | |
Output = Output & StrList(I) | |
Next I | |
ConcatenateStr = Output | |
End Function | |
Private Sub ShowCodeWindow() | |
'表示中のコードウィンドウをフォーカスする。 | |
'20211223 | |
'20211227修正 | |
Call SendKeysWSH("{F7}") | |
End Sub | |
Private Sub SendKeysWSH(ByVal Keys As String, Optional Wait As Boolean = False) | |
'https://santane.jp/wp/?p=355 | |
'http://wsh.style-mods.net/ref_wshshell/sendkeys.htm | |
'20211227 | |
'20220228 入力されたローマ字が大文字の場合は小文字にする | |
'大文字は小文字にする | |
Keys = StrConv(Keys, vbLowerCase) | |
'メモリ効率より動作速度を優先する場合 | |
Static wshShell As Object | |
If PbwshShell Is Nothing Then | |
Set PbwshShell = CreateObject("WScript.Shell") | |
End If | |
Set wshShell = PbwshShell | |
Call wshShell.SendKeys(Keys, Wait) | |
End Sub | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment