質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

777閲覧

VBA 特定の文字の横に表示

yuya_i

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2020/11/02 12:39

編集2020/11/02 12:51

特定の文字の横にファイル名を表示させるVBAを教えて下さい。

添付画像のように【有】と【無】の文字がP4セルからP11セルにはいっています。
このエクセルファイルが保存されているフォルダ内のPDFの名前を
【有】と表示されている隣のセルQ4、Q7~Q11セルに表示されるようにするには
どうすればよいでしょうか。

現在のマクロだと、【無】の所をとばした際に
ファイル名も次のファイルに移動してしまい正しく取得できません。

Sub test() Dim buf As String Dim fp As String Dim i As Long fp = ThisWorkbook.Path & "\" With CreateObject("System.Collections.ArrayList") buf = Dir(fp & "*.pdf") Do While buf <> "" .Add Format(FileDateTime(fp & buf), "YYYYMMDDHHNNSS") & buf buf = Dir() Loop .Sort For i = 0 To .Count - 1 If Cells(i + 4, 16) = "有" Then Cells(i + 4, 17) = Mid(.Item(i), 15) Else i = i - 1 End If Next i End With End Sub

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/11/02 12:48

コードは「コードの挿入」で記入してください。
yuya_i

2020/11/02 12:52

申し訳ありません。これでよろしいでしょうか。
meg_

2020/11/02 12:55

インデントがないままなので、コードが読みにくいです。 セルを指定するインデックスとファイル名を指定するインデックスを分ければ良いのではないでしょうか?
guest

回答3

0

ArrayList用の変数と、出力セル指定用の変数を別に用意しないとだめでしょう。

vba

1'前略 2 j = 3 3 For i = 0 To .Count - 1 4 Do 5 j = j + 1 6 If Cells(j, 16) = "" Then 7 Exit For 8 ElseIf Cells(j, 16) = "有" Then 9 Cells(j, 17) = Mid(.Item(i), 15) 10 Exit Do 11 End If 12 Loop 13 Next i 14'後略

別案

セル範囲の方を For Each でループさせた方がシンプルになりますね。

vba

1'前略 2 Dim c As Range 3 For Each c In Cells(4, 16).CurrentRegion 4 If i > .Count - 1 Then Exit For 5 If c = "有" Then 6 c.Offset(, 1) = Mid(.Item(i), 15) 7 i = i + 1 8 End If 9 Next 10 11'後略

投稿2020/11/02 12:55

編集2020/11/02 14:24
hatena19

総合スコア33788

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuya_i

2020/11/02 14:18

ありがとうございます。 教えて頂いたコードでやりたい事ができました。 考え方など参考になりました。 ありがとうございました。
guest

0

ベストアンサー

これでどうでしょう。

二つ目のループについて、
セルの確認(有or無)をする変数iの外に
配列のカウントアップをするjを追加して、
セルが無のときにも配列のカウントアップが進んでしまわないようにしています。

Sub test() Dim buf As String Dim fp As String Dim i As Long Dim j As Long j = 0 fp = ThisWorkbook.Path & "\" With CreateObject("System.Collections.ArrayList") buf = Dir(fp & "*.pdf") Do While buf <> "" .Add Format(FileDateTime(fp & buf), "YYYYMMDDHHNNSS") & buf buf = Dir() Loop .Sort For i = 0 To .Count - 1 If Cells(i + 4, 16) = "有" Then Cells(i + 4, 17) = Mid(.Item(j), 15) j = j + 1 Else i = i + 1 End If Next i End With End Sub

投稿2020/11/02 13:18

konishi201102

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuya_i

2020/11/02 14:20

ありがとうございます。 頂いたコードで目的の動作が確認できました。 ありがとうございました。
guest

0

For-Nextとは別の変数を使った場合の例です。Do-Loopが無限ループにならないよう注意が必要です。

VBA

1Dim j As Integer 2For i = 0 To .Count - 1 3 Do Until Cells(j + 4, 16).Value = "有" Or Cells(j + 4, 16).Value = "" 4 j = j + 1 5 Loop 6 Cells(j + 4, 17).Value = Mid(.Item(i), 15) 7Next i 8'For i = 0 To .Count - 1 9' If Cells(i + 4, 16) = "有" Then 10' Cells(i + 4, 17) = Mid(.Item(i), 15) 11' Else 12' i = i - 1 13' End If 14'Next i

投稿2020/11/02 13:07

TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuya_i

2020/11/02 14:19

ありがとうございました。 目的が果たすことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問