Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


41 / 3841 ページ ←次へ | 前へ→

【81666】VBAコードの書き方
質問  s  - 21/2/20(土) 9:34 -

引用なし
パスワード
   こんにちは。
VBAど素人なので、どうかご教示いただけないでしょうか?

   ドリンク フード 消耗品
A店  10      50      −60
B店    60     −55       20
C店  −30      15      −65

上記のような在庫表があったとき、
±50の数字とそれに該当する、A列の店名、
1行目の在庫名を隣のセルに抽出する場合の
コードはどのようにすれば良いのでしょうか?
・ツリー全体表示

【81665】Re:結合セルの先頭行
回答  γ  - 21/2/18(木) 9:47 -

引用なし
パスワード
   こういうことですか?
Sub test()
  Dim r As Range
  For Each r In Intersect(ActiveSheet.UsedRange, Columns("A"))
    If r.MergeCells Then
      If r.Address = r.MergeArea(1).Address Then
        Debug.Print r.Row
      End If
    End If
  Next
End Sub
・ツリー全体表示

【81664】結合セルの先頭行
質問  E.T  - 21/2/17(水) 22:49 -

引用なし
パスワード
   こんばんは。
A列で、1〜3行目が結合セル、4〜8行目が結合セル、9行目は結合なし、10〜12行目が結合セル・・・これは例であって、どの行とどの行が結合セルになるかは固定ではありません。結合セルがどことどこであっても、それぞれ結合セルごとの先頭の行を知りたいのですが、どなたか教えてください。ちなみに、最終行も固定ではありません。
・ツリー全体表示

【81663】Re:フォルダパスが変動しても対応したい。
発言  γ  - 21/2/16(火) 7:26 -

引用なし
パスワード
   少なくとも実行できるレベルのもの
(無論、希望に達していないもので結構ですが)を
再提示してもらえば、コメントする用意はありますよ。
・ツリー全体表示

【81662】Re:フォルダパスが変動しても対応したい。
お礼  のっち  - 21/2/16(火) 5:58 -

引用なし
パスワード
   コピーしてから一部打ち替えたものですが、
確かによく見ると、気になる点多々ありますね。

これでは指摘のしようが無い、と言われてもしかた無いかも知れません。
考え直します。
・ツリー全体表示

【81661】Re:フォルダパスが変動しても対応したい。
発言  γ  - 21/2/15(月) 9:11 -

引用なし
パスワード
   まず、これはVBEからコピーペイストしたものなんですか?
これだけの量のコードを手打ちしたとは思えませんが、念のため確認します。
コピーペイストすることを推奨します。
入力ミスの検証までは勘弁して欲しいからです。

その上で申し上げますが、
デバッグ依頼ということなんでしょうか?
コンパイルエラーを含めて一切合切見て下さい、
などという質問はやめてください。

少なくともコンパイルエラーが出ないものを提示し直してください。

なお、インデントをキチンとつけたほうが、
コードの構造がもっと正確にわかるはずですよ。
そのこともお薦めしておきます。
・ツリー全体表示

【81660】フォルダパスが変動しても対応したい。
質問  のっち  - 21/2/14(日) 22:12 -

引用なし
パスワード
   行いたい事はデスクトップ上にあるとあるフォルダーの中にいくつかエクセルファイルがあります。(ファイル名が違うだけで同じ様な形)。

そのフォルダー内のファイルを全部開いて同じセルに決められた文字を入れた後、
それぞれPDFで出力して元のファイルを保存して閉じる。そしてそのフォルダーを開いておく、という形です。

フォルダ名〇は変動しない、★は変動する AorBどちらかのフォルダ名がある。


Sub 指定フォルダーのExcelファイルを全て開く()

Dim myPath As String, myfile As String

If ThisWorkbook.Sheets(1).Range("B8") = "" Then
 MsgBox "数字の入力は必須です!"
 Exit Sub
End If

If Dir("〇〇〇★★★AAA)", vbDirectory) <> "" Then
 myPath = "〇〇〇★★★AAA)\"
ElseIf Dir("〇〇〇★★★BBB", vbDirectory) <> "" Then
 myPath = "〇〇〇★★★BBB)\"
Else
MsgBox "対象のファイルがありません。"
Exit Sub
End If
 
 myfile = Dir(myPath & "*.xlsx*")

 Do
  Workbooks.Open Filename:=myPath & "\" & myfile
  
 Dim i As Long
 For i = 1 To Sheets.Count
  If Sheets(i).Visible = True Then
   Sheets(i).Range("H4") = ThisWorkbook.Sheets(1).Range("B8").Text
 
  End If
  
 Next i
  myfile = Dir
 Loop Until myfile = "" 
Call pdfに出力
 
End Sub
---------------------------------------------------------------------
Sub pdfに出力()

Dim myPath As String, myfile As String

If Dir("〇〇〇★★★AAA)", vbDirectory) <> "" Then
 myPath = "〇〇〇★★★AAA)\"
ElseIf Dir("〇〇〇★★★BBB", vbDirectory) <> "" Then
 myPath = "〇〇〇★★★BBB)\"
Else
MsgBox "対象のファイルがありません。"
Exit Sub
End If
 
Do While myfile <> ""

Workbooks(myfile).Activate

Dim i As Long
 For i = 1 To Sheets.Count
  If Sheets(i).Visible = True Then
   Sheets(i).Select Replace:=False
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
  Filename:=Left(Workbooks(myfile).FullName, InStrRev(Workbooks(myfile).FullName, ".")) & "pdf"

End If
Next

Workbooks(myfile).Close SaveChanges:=True  'ブックを閉じる
myfile = Dir
 
Loop

If Dir("〇〇〇★★★AAA", vbDirectory) <> "" Then
 CreateObject("Shell.Application").Open "〇〇〇★★★AAA"
ElseIf Dir("〇〇〇★★★BBB", vbDirectory) <> "" Then
 CreateObject("Shell.Application").Open "〇〇〇★★★BBB"
End If

End Sub

〇★AorBの所をあらかじめ入れておけばちゃんと動くのですが、
★を変動できるように

Sub 指定フォルダーのExcelファイルを全て開く()

Dim myPath As String, myfile As String
Dim myPath1 As String, myPath2 As String, myPath3 As String
Dim myNum As String
 myNum = Range("E10").Text

If ThisWorkbook.Sheets(1).Range("B8") = "" Then
 MsgBox "数字の入力は必須です!"
 Exit Sub
End If

myPath = "〇〇〇"
myPath1 = myPath & myNum & "AAA\"
myPath2 = myPath & myNum & "BBB\"

If Dir(myPath1, vbDirectory) <> "" Then
 myPath3 = myPath1
ElseIf Dir(myPath2, vbDirectory) <> "" Then
 myPath3 = myPath2
Else
MsgBox "対象のファイルがありません。"
Exit Sub
End If
 
 myfile = Dir(myPath & "*.xlsx*")
   
 Do
  Workbooks.Open Filename:=myPath & "\" & myfile
  
 Dim i As Long
 For i = 1 To Sheets.Count
  If Sheets(i).Visible = True Then
   Sheets(i).Range("H4") = ThisWorkbook.Sheets(1).Range("B8").Text
   
  End If
  
 Next i
  myfile = Dir
 Loop Until myfile = "" 
Call pdfに出力
 
End Sub
---------------------------------------------------------------------
Sub pdfに出力()
Dim myPath As String, myfile As String
Dim myPath1 As String, myPath2 As String, myPath3 As String
Dim myNum As String
 myNum = Range("E10").Text

If ThisWorkbook.Sheets(1).Range("B8") = "" Then
 MsgBox "数字の入力は必須です!"
 Exit Sub
End If

myPath = "〇〇〇"
myPath1 = myPath & myNum & "AAA\"
myPath2 = myPath & myNum & "BBB\"

End If
 
myfile = Dir(myPath & "*.xlsx*")

 
Do While myfile <> ""

Workbooks(myfile).Activate

Dim i As Long
 For i = 1 To Sheets.Count
  If Sheets(i).Visible = True Then
   Sheets(i).Select Replace:=False
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
  Filename:=Left(Workbooks(myfile).FullName, InStrRev(Workbooks(myfile).FullName, ".")) & "pdf"

End If
Next

Workbooks(myfile).Close SaveChanges:=True  'ブックを閉じる
myfile = Dir
 
Loop

CreateObject("Shell.Application").Open myPath3
End If

End Sub

とすると、ファイルが開いてセルに値が入るまではうまくいきますが、
PDFに書き出したり、保存して閉じるをやってくれずに終了します。

最初のパスを直接指定している時と、変動でも出来るようにしている時と何が違うのでしょうか?

何かお気づきの点あればご示唆お願い致します。
・ツリー全体表示

【81659】Re:複数のシートを分割し、保存
発言  γ  - 21/2/12(金) 19:36 -

引用なし
パスワード
   別の方法の紹介です。参考まで。

特別の二つのシートを最初に(一番左に)寄せて置き、
Sub test()
  For k = 3 To Worksheets.Count
    Set ws = Worksheets(k)
    
    ' wsに対して処理する
  Next
End Sub
こんな風にすることもありますね。

うっかり順序を変えるといけないですが。
もし自分だけがユーザーで、それを承知していれば、
ならこんな方法もとれるでしょう。
・ツリー全体表示

【81658】Re:複数のシートを分割し、保存
発言  OK  - 21/2/11(木) 16:24 -

引用なし
パスワード
   ↑のコードの
"シート一覧"は "リスト一覧"と読み替えてください。
・ツリー全体表示

【81657】Re:複数のシートを分割し、保存
発言  OK  - 21/2/11(木) 16:17 -

引用なし
パスワード
   Dictionaryオブジェクトを使用した例です。

Sub sheets_save2()
Dim jogaidic As Object

 Set jogaidic = CreateObject("Scripting.Dictionary")

'Dictionaryに追加
 jogaidic.Add "テンプレ", "テンプレ"
 jogaidic.Add "シート一覧", "シート一覧"
 For Each シート In Worksheets

  ''シート名がDictionaryに登録されたものの中に含まれてなかったら
  If Not jogaidic.exists(シート.Name) Then '
   シート.Copy
   ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & シート.Name
  ActiveWorkbook.Close
  End If
 Next シート

 jogaidic.RemoveAll
 Set jogaidic = Nothing
End Sub
・ツリー全体表示

【81656】Re:複数のシートを分割し、保存
発言  OK  - 21/2/11(木) 14:18 -

引用なし
パスワード
   今後の参考に。

Dictionaryオブジェクトを使って、Dictionary
に格納されているか否かで判定する、という方法
もあります。
・ツリー全体表示

【81655】Re:複数のシートを分割し、保存
発言  OK  - 21/2/11(木) 14:13 -

引用なし
パスワード
   参考過去HPです。

ht tps://www.sejuku.net/blog/30059
・ツリー全体表示

【81654】Re:複数のシートを分割し、保存
発言  OK  - 21/2/11(木) 14:09 -

引用なし
パスワード
   >If シート.Name <> "テンプレ" Then

And を使います。

If シート.Name <> "テンプレ" And シート.Name <> "シート一覧" Then
・ツリー全体表示

【81653】複数のシートを分割し、保存
質問  はな  - 21/2/11(木) 13:53 -

引用なし
パスワード
   テンプレ(sheet1)と、リスト一覧(sheet2)以外は、取引先の会社名がシート名になったエクセルファイルがあります。

テンプレと、リスト一覧以外を分割して、一枚ずつに保存(保存名はシート名)して、同じ保存先に格納したいのですが、テンプレとリスト一覧のシート2枚を除いてという設定がうまくいきません。

テンプレのみ、またはリスト一覧のみを除いてだけだったらいけるのですが、、、

以下、ご教示ください。

Sub sheets_save()
For Each シート In Worksheets
If シート.Name <> "テンプレ" Then
シート.Copy
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & シート.Name
ActiveWorkbook.Close
End If
Next シート
End Sub
・ツリー全体表示

【81652】Re:日付で表に自動入力
お礼  amu  - 21/2/6(土) 5:05 -

引用なし
パスワード
   ▼γ さん:することができました!ありがとうございます。
Excel自体まだ不慣れで用語の変な言い回しや、このサイトがマクロについて聞く場所だと知らないまま質問してしまい、申し訳ありません。
そんな中、質問に答えてくださり本当に助かりました。ありがとうございました!
・ツリー全体表示

【81651】Re:Private Sub Worksheet_Changeについて
お礼  TDS  - 21/2/5(金) 8:24 -

引用なし
パスワード
   ▼γ さん:おはようございます。
ご指導ありがとうございます。
試行錯誤中ですが、よろしくお願いしますmm
・ツリー全体表示

【81650】Re:日付で表に自動入力
発言  γ  - 21/2/5(金) 7:04 -

引用なし
パスワード
   数値が飛ぶ とは?

Sheet2のB列には以下の式を入れたらどうですか?
=IFERROR(VLOOKUP(A1,Sheet1!C:G,5,FALSE),"")
簡単なことは簡単にしたほうがよいでしょう。
マクロを使う必要もないのでは?

どうしてもイベントプロシージャということなら、
あなたが出来ているところまで示して下さい。
・ツリー全体表示

【81649】Re:日付で表に自動入力
発言  amu  - 21/2/5(金) 2:34 -

引用なし
パスワード
   ▼TDS さんありがとうございます。

説明が足りず申し訳ないです、合計ではなく

仮にA表C列に2/4、G列に100と入力した際にB表の2/4のB列に100という数値が飛ぶようにしたいです。

A表の日付や数値は当日になってから入力していくため事前に日付はわかりません。


  <<Sheet1>>A表        <<Sheet2>>B表     
  C列     G列     A列      B列
1  2021/2/4  100   1  2021/2/1    
2  2021/2/10      2  2021/2/2    
3  2021/2/16      3  2021/2/3    
4  2021/2/20      4  2021/2/4  (100)
5  2021/2/24      5  2021/2/5    
6  2021/2/28      6  2021/2/6    

こういった感じでできると助かります。
よろしくお願い致します。
・ツリー全体表示

【81648】Re:日付で表に自動入力
発言  amu  - 21/2/5(金) 2:32 -

引用なし
パスワード
   ▼γ さんありがとうございます。
説明が足りず申し訳ないです、、、

仮にA表C列に2/4、G列に100と入力した際にB表の2/4のB列に100という数値が飛ぶようにしたいです。

A表の日付や数値は当日になってから入力していくため事前に日付はわかりません。


  <<Sheet1>>A表        <<Sheet2>>B表     
  C列     G列     A列      B列
1  2021/2/4  100   1  2021/2/1    
2  2021/2/10      2  2021/2/2    
3  2021/2/16      3  2021/2/3    
4  2021/2/20      4  2021/2/4   (100)
5  2021/2/24      5  2021/2/5    
6  2021/2/28      6  2021/2/6    

こういった感じでできると助かります。
あらかじめ式を設定しておくことも大丈夫です。
よろしくお願い致します。
・ツリー全体表示

【81647】Re:Private Sub Worksheet_Changeについて
発言  γ  - 21/2/4(木) 23:08 -

引用なし
パスワード
   本筋と違うので端折っていましたが、念のため書いておきます。
(1)Cells(Target.Row, Target.Column)は、単にTargetでよいでしょう。
(2)Changeプロシージャのなかでセルの値を変更すると(この場合、該当)、
  それが連鎖的にイベントプロシージャを引き起こします。
  この場合は、脱出条件で脱出することはしますが、
  起動されない手当をしておいたほうがよいと思います。

  以下のようにすることが定石です。
  Application.EnableEvents = False
  'セルの変更処理
  Application.EnableEvents = True
 
  これは常に意識しておいたほうがよいと思います。
・ツリー全体表示

41 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free