Excel VBA質問箱 IV

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

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


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

【81478】セル内の選択文字列を赤太字にしたい
質問  りった  - 20/9/15(火) 9:58 -

引用なし
パスワード
   セル内の強調したい部分を、F2でセルに入って選択してから文字色赤+太字にしているのですが、セルが1000個以上有ってボタン2回押すのが面倒です。
マクロで1操作に出来ますでしょうか?可能でしたら方法をご教示ください。

尚、どこを強調するかをマクロで判断するのは困難です。
・ツリー全体表示

【81477】Re:IF文ーアクティブシート名と一致だ...
発言  γ  - 20/9/11(金) 14:48 -

引用なし
パスワード
   wsはループの中での話を単純にした説明だったのかと思っていました。
簡単な話だったのですね。

wsとだけ指定したときに、それがNameプロパティに値を返すわけではないですね。
しっかりプロパティを付ける必要があるということです。
今後、こうした場面も多かろうと思いますので、記憶下さい。

なお、nameが小文字になってしまう件ですが、
過去に、
Dim name As String
といった変数宣言をした副作用です。
Dim Name As String
とダミーで宣言して、直ぐに消せば、元のように
ws.Nameと戻るはずです。
・ツリー全体表示

【81476】Re:IF文ーアクティブシート名と一致だ...
発言  [名前なし]  - 20/9/11(金) 13:43 -

引用なし
パスワード
   >▼γ さん:

解決しました!

If ActiveSheet.name = "MS&AD" Then

でした。


>
>ご返信をありがとうございます。
>下のように、ws1を使用せずに、シート名をダイレクトに書きにし、“Name”もドットを打って出てくるリストから選択したのですが、“.Name”が“.name”と小文字に自動変更してしまいます。そして、この行がエラーになります。
>どうしてなんでしょうか。
>
>Dim wsActive As Worksheet
>Set wsAvtive = ActiveSheet
>
>If wsActive.Name = Worksheets("MS&AD").Name Then
>↓
>If wsActive.name = Worksheets("MS&AD").name Then
>
>
>>if wsActive.name = ws1 then
>>  ↓
>>If wsActive.Name = ws1.Name Then
>>としてください。
>>
>>なお、投稿にあたっては、VBEの画面から
>>直接コピーペイストして、手打ちは避けてください。
>>Set ws1 = Worksheet("MSAD")はエラーになるはずです。
・ツリー全体表示

【81475】Re:IF文ーアクティブシート名と一致だ...
質問  [名前なし]  - 20/9/11(金) 13:03 -

引用なし
パスワード
   ▼γ さん:

ご返信をありがとうございます。
下のように、ws1を使用せずに、シート名をダイレクトに書きにし、“Name”もドットを打って出てくるリストから選択したのですが、“.Name”が“.name”と小文字に自動変更してしまいます。そして、この行がエラーになります。
どうしてなんでしょうか。

Dim wsActive As Worksheet
Set wsAvtive = ActiveSheet

If wsActive.Name = Worksheets("MS&AD").Name Then

If wsActive.name = Worksheets("MS&AD").name Then


>if wsActive.name = ws1 then
>  ↓
>If wsActive.Name = ws1.Name Then
>としてください。
>
>なお、投稿にあたっては、VBEの画面から
>直接コピーペイストして、手打ちは避けてください。
>Set ws1 = Worksheet("MSAD")はエラーになるはずです。
・ツリー全体表示

【81474】Re:IF文ーアクティブシート名と一致だ...
回答  γ  - 20/9/11(金) 12:21 -

引用なし
パスワード
   if wsActive.name = ws1 then
  ↓
If wsActive.Name = ws1.Name Then
としてください。

なお、投稿にあたっては、VBEの画面から
直接コピーペイストして、手打ちは避けてください。
Set ws1 = Worksheet("MSAD")はエラーになるはずです。
・ツリー全体表示

【81473】IF文ーアクティブシート名と一致だった...
質問  ぐりぐり  - 20/9/11(金) 10:43 -

引用なし
パスワード
   こんにちわ。

Activeのシート名が一致している場合は、ある動き(ここでは"メッセージ表示"としています)をする、というモジュールを作成したいのですが、上手く動きません。

どこをどう直せばいいのか判らず、助けていただけますでしょうか。
よろしくお願いします!


Dim wsActive as Worksheet
Dim ws1 as Worksheet

Set wsActive = ActiveSheet
Set ws1 = Worksheet("MSAD")

if wsActive.name = ws1 then

Msgbox"OK"

Else

Msgbox"ちがうよ"

End if
・ツリー全体表示

【81472】Re:エクセルVBAのWorkSheet_Change実施後...
発言  γ  - 20/9/11(金) 7:43 -

引用なし
パスワード
   あなたが言うところの"最初のセル"は、"D8"セルに固定なんですかね。
コードの意図がわからないので、なんともコメントのしようがないので、
あなたの意図をもう少し説明されるとよいと思います。

参考までにコメントしておくと、
Target引数には、変更になったセルが渡されますから、
そのアドレスで判断して、
・特定のセルが変更になった場合だけ処理をする(それ以外は直ぐにプロシージャを抜ける)ことや、
・逆に、特定のセル以外が変更になった場合だけ処理をする、
といったことができます。

あなたの意図に沿ってそれらを使えることができると思います。
・ツリー全体表示

【81471】Re:エクセルVBAのWorkSheet_Change実施後...
発言  γ  - 20/9/9(水) 16:12 -

引用なし
パスワード
   セットができてからも、相変わらずそのイベントプロシージャは
動作しますよ。
なにか入力しても、指定したセルには予め決めたものが
書き込まれると、あなたが指示された訳ですが、
そにあたりはどのように整理されていますか?
・ツリー全体表示

【81470】エクセルVBAのWorkSheet_Change実施後の...
質問  たか E-MAIL  - 20/9/9(水) 14:25 -

引用なし
パスワード
   エクセルで、各項目への入力漏れを減らすために、最初のセルに入力があれば、他の入力必須項目に薄灰色文字で「入力」と表示させ、そこに入力があるとその文字が消え、通常通りに黒文字で入力ができるようにしたいです。
VBAをどうにか調べて書き、
1. 最初のセルに入力があれば、他の必須項目に薄灰色文字で「入力」と表示させる
2. 最初のセルが空白になれば、他の必須項目の「入力」が消える
ようには出来たのですが、実際に必須項目に「入力」と表示されたセルに文字入力をしようとすると、
1. 上書きが全くできず灰色文字の「入力」に戻ってしまう
2. 最初のセルが空白であれば、入力必須項目に入力しても空白になる
という状況です。
下記の通りのVBAを作ってみたのですが、どこが間違っているのでしょうか?
どのように記載すればよいでしょうか?
どなたかご教示をお願いします。

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  Application.ScreenUpdating = False
    If Range("D8") <> "" Then
      Call 入力推奨文字表示
    Else
      Range("R5,Y6,Y9,AB6,AB9,AG5,AM5,AS6,AS9,AX9,AY6,BF7,BF9,BG5,BL5") = ""
    End If
  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub

Sub 入力推奨文字表示()
  Application.EnableEvents = False
  Application.ScreenUpdating = False
    With Range("R5,AB6,AB9,AG5,AM5,AS6,AS9,AX9,AY6,BF7,BF9,BG5")
      .Value = "入力"
      .Font.ColorIndex = 15
      .Font.Bold = True
    End With
  選択
  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub
      
Sub 選択()
  Application.EnableEvents = False
  Application.ScreenUpdating = False
     Range("Y6,Y9") = "未"
     Range("BL5") = "選択"
  Application.EnableEvents = True
  Application.ScreenUpdating = True
    
End Sub
・ツリー全体表示

【81469】Re:EXCELの条件付き書式のフォントサイズ...
お礼  やまちゃん  - 20/9/7(月) 19:27 -

引用なし
パスワード
   ▼γ さん:
>>VBAを使えばフォントサイズも自由に変更出来るかと思うのですが、
>>どのようにコードを記述すればいいでしょうか?
>
>条件付き書式の適用を条件とするなら、それは無理な注文です。
>フォントの大きさ変更は条件付き書式ではできませんから、
>VBAにしたからといって、それが可能になることはありません。
>
>条件付き書式から離れて、ということであれば、
>もちろんフォントの大きさ変更は可能です。
>マクロ記録をとれば、Selection.Font.Size = xxのようなものが判明するはずです。
>あとは、ご自分で条件判定するロジックを書いてください。
>ちょっと意味がとれなかったので、その点はそちらで検討してください。
>
>そのマクロをどういうタイミングで実行するかという話もありますし、
>条件付き書式の範囲内で納めるのがよいと思いますよ。
>(例えば、塗りつぶしには、色を使わないパターンもありますから、
>灰色6.25%などを使えば、プリントしても目立つのでは?)
>
>なお、8/12に投稿された方と同じであれば、
>新規投稿ではなく、こちらのコメントに「返信」する形で
>返事をしてください。

γさん、お返事ありがとうございます。
中途半端な質問ですみません。
もう一度、考えてみます。
できるところまでやってみてわからない時は再度質問させて頂きます。
・ツリー全体表示

【81468】Re:EXCELの条件付き書式のフォントサイズ...
発言  γ  - 20/9/7(月) 9:31 -

引用なし
パスワード
   >VBAを使えばフォントサイズも自由に変更出来るかと思うのですが、
>どのようにコードを記述すればいいでしょうか?

条件付き書式の適用を条件とするなら、それは無理な注文です。
フォントの大きさ変更は条件付き書式ではできませんから、
VBAにしたからといって、それが可能になることはありません。

条件付き書式から離れて、ということであれば、
もちろんフォントの大きさ変更は可能です。
マクロ記録をとれば、Selection.Font.Size = xxのようなものが判明するはずです。
あとは、ご自分で条件判定するロジックを書いてください。
ちょっと意味がとれなかったので、その点はそちらで検討してください。

そのマクロをどういうタイミングで実行するかという話もありますし、
条件付き書式の範囲内で納めるのがよいと思いますよ。
(例えば、塗りつぶしには、色を使わないパターンもありますから、
灰色6.25%などを使えば、プリントしても目立つのでは?)

なお、8/12に投稿された方と同じであれば、
新規投稿ではなく、こちらのコメントに「返信」する形で
返事をしてください。
・ツリー全体表示

【81467】EXCELの条件付き書式のフォントサイズに...
質問  やまちゃん  - 20/9/6(日) 17:22 -

引用なし
パスワード
   度々、お世話になります。
VBA勉強中につき、どなたかお知恵をお貸し願います。

EXCELである商品の発注書を作成中。
1列から9列目(行数は商品アイテムにより変化する)には発注書のフォーマットがあり、同一シートの13列目には基本の上代、14列目〜21列目はそれぞれ微妙に異なるパターンの変更上代が記載されており、あるルールに従って発注書の上代記載箇所の5列目に関数を使用してそれぞれの顧客に対応した上代を表示(変更しないのもあるため、混在する)。
そこで、条件付き書式を使い、基本上代13列目と異なる場合は太字の斜体としていますが、条件付き書式ではフォントサイズが変更できないので、目立ちません。
しかもプリントアウトするのはモノクロの為、FONTカラー意味がありません。

13列目   14列目    15列目

基本上代  パターン1  パターン2

100     110     120
120     130     140
150     150     160

このような対応表があるとして、A店を店舗コードで呼び出すと、発注書の上代がパターン1の上代となり、ここでは110と130だけが基本と異なるので太字の斜体。
B店を呼び出すとパターン2の上代となり、全て太字の斜体となる。
C店は基本のまま。


VBAを使えばフォントサイズも自由に変更出来るかと思うのですが、どのようにコードを記述すればいいでしょうか?
勉強不足の為、ほぼ、丸投げとなってしまいますが、サンプルとなるコードを教えていただけないでしょうか?
どなたか、宜しくお願いします。
・ツリー全体表示

【81466】Re:APIの引数へVBAからnull 及び構造体を...
回答  core  - 20/8/23(日) 22:36 -

引用なし
パスワード
   VBAでのポインター操作は制約が多いので、API宣言を下記のようにしてください。

Private Declare PtrSafe Function _
  SetupDiGetDeviceInterfaceDetail Lib "SetupAPI.dll" _
  Alias "SetupDiGetDeviceInterfaceDetailA" ( _
  ByVal DeviceInfoSet As LongPtr, _
  ByVal pDeviceInterfaceData As LongPtr, _
  Optional ByVal pDeviceInterfaceDetailData As LongPtr, _
  Optional ByVal DeviceInterfaceDetailDataSize As Long, _
  Optional ByVal pRequiredSize As LongPtr, _
  Optional ByVal pDeviceInfoData As LongPtr) As Long

使用はこんな風になります。

dim sz as long, hr as long
dim data as SP_DEVICE_INTERFACE_DATA

'// 必要bufferサイズ取得
hr = SetupDiGetDeviceInterfaceDetail(hDev, VarPtr(data), , , VarPtr(sz))
' :
'// メモリ確保: ptr
' :
'// SP_DEVICE_INTERFACE_DETAIL_DATA中身取得
hr = SetupDiGetDeviceInterfaceDetail(hDev, VarPtr(data), ptr, sz)

※無駄なANSI-Unicode文字列変換が行われるので、
 Ansi系API宣言は避けるべきです。xxxW系のAPI宣言が望ましいです。
・ツリー全体表示

【81465】Re:for next ループ
発言  マナ  - 20/8/18(火) 19:22 -

引用なし
パスワード
   ▼J さん:
>以下の別ブックからのコピペのループがうまくいかず頭を抱えております・・・
>ご指南頂けると幸いです。

ループを使って、完結でわかりやすい記述にしたい
ということでしょうか。

でしたら、そのいまくいかないというコードもみせてください。
提示されたコードから、繰り返しのルールを考えるのは、面倒なので。
・ツリー全体表示

【81464】Re:指定フォルダ内最新ファイル名の転記...
発言  マナ  - 20/8/18(火) 18:55 -

引用なし
パスワード
   ht tps://www.moug.net/faq/viewtopic.php?t=79745&sid=6ce23987bdac47d12924fd3c8c6d9bc7
・ツリー全体表示

【81463】Re:for next ループ
回答  γ  - 20/8/18(火) 7:59 -

引用なし
パスワード
   うまくいかない、ということをもう少し詳しく書いてください。
エラーがでるなら、どこで発生して、どんなエラーか。
想定と異なるなら、想定と実際の差異を説明してください。
・ツリー全体表示

【81462】for next ループ
質問  J  - 20/8/18(火) 7:43 -

引用なし
パスワード
   以下の別ブックからのコピペのループがうまくいかず頭を抱えております・・・
ご指南頂けると幸いです。

WBsaki.Worksheets(1).Range("A2:A9").Value = WBmoto.Worksheets(1).Range("C5:C12").Value
WBsaki.Worksheets(1).Range("B2:B9").Value = WBmoto.Worksheets(1).Range("D5:D12").Value
WBsaki.Worksheets(1).Range("C2:C9").Value = WBmoto.Worksheets(1).Range("A4").Value
WBsaki.Worksheets(1).Range("D2:D9").Value = WBmoto.Worksheets(1).Range("I5:I12").Value
WBsaki.Worksheets(1).Range("E2:E9").Value = WBmoto.Worksheets(1).Range("J5:J12").Value
  
WBsaki.Worksheets(1).Range("A10:A17").Value = WBmoto.Worksheets(1).Range("L5:L12").Value
WBsaki.Worksheets(1).Range("B10:B17").Value = WBmoto.Worksheets(1).Range("M5:M12").Value
WBsaki.Worksheets(1).Range("C10:C17").Value = WBmoto.Worksheets(1).Range("A4").Value
WBsaki.Worksheets(1).Range("D10:D17").Value = WBmoto.Worksheets(1).Range("R5:R12").Value
WBsaki.Worksheets(1).Range("E10:E17").Value = WBmoto.Worksheets(1).Range("S5:S12").Value
  
WBsaki.Worksheets(1).Range("A18:A25").Value = WBmoto.Worksheets(1).Range("U5:U12").Value
WBsaki.Worksheets(1).Range("B18:B25").Value = WBmoto.Worksheets(1).Range("V5:V12").Value
WBsaki.Worksheets(1).Range("C18:C25").Value = WBmoto.Worksheets(1).Range("A4").Value
WBsaki.Worksheets(1).Range("D18:D25").Value = WBmoto.Worksheets(1).Range("AA5:AA12").Value
WBsaki.Worksheets(1).Range("E18:E25").Value = WBmoto.Worksheets(1).Range("AB5:AB12").Value
  
WBsaki.Worksheets(1).Range("A26:A33").Value = WBmoto.Worksheets(1).Range("AD5:AD12").Value
WBsaki.Worksheets(1).Range("B26:B33").Value = WBmoto.Worksheets(1).Range("AE5:AE12").Value
WBsaki.Worksheets(1).Range("C26:C33").Value = WBmoto.Worksheets(1).Range("A4").Value
WBsaki.Worksheets(1).Range("D26:D33").Value = WBmoto.Worksheets(1).Range("AJ5:AJ12").Value
WBsaki.Worksheets(1).Range("E26:E33").Value = WBmoto.Worksheets(1).Range("AK5:AK12").Value
 
WBsaki.Worksheets(1).Range("A34:A41").Value = WBmoto.Worksheets(1).Range("C15:C22").Value
WBsaki.Worksheets(1).Range("B34:B41").Value = WBmoto.Worksheets(1).Range("D15:D22").Value
WBsaki.Worksheets(1).Range("C34:C41").Value = WBmoto.Worksheets(1).Range("A14").Value
WBsaki.Worksheets(1).Range("D34:D41").Value = WBmoto.Worksheets(1).Range("I15:I22").Value
WBsaki.Worksheets(1).Range("E34:E41").Value = WBmoto.Worksheets(1).Range("J15:J22").Value

WBsaki.Worksheets(1).Range("A42:A49").Value = WBmoto.Worksheets(1).Range("L15:L22").Value
WBsaki.Worksheets(1).Range("B42:B49").Value = WBmoto.Worksheets(1).Range("M15:M22").Value
WBsaki.Worksheets(1).Range("C42:C49").Value = WBmoto.Worksheets(1).Range("A14").Value
WBsaki.Worksheets(1).Range("D42:D49").Value = WBmoto.Worksheets(1).Range("R15:R22").Value
WBsaki.Worksheets(1).Range("E42:E49").Value = WBmoto.Worksheets(1).Range("S15:S22").Value

WBsaki.Worksheets(1).Range("A50:A57").Value = WBmoto.Worksheets(1).Range("U15:U22").Value
WBsaki.Worksheets(1).Range("B50:B57").Value = WBmoto.Worksheets(1).Range("V15:V22").Value
WBsaki.Worksheets(1).Range("C50:C57").Value = WBmoto.Worksheets(1).Range("A14").Value
WBsaki.Worksheets(1).Range("D50:D57").Value = WBmoto.Worksheets(1).Range("AA15:AA22").Value
WBsaki.Worksheets(1).Range("E50:E57").Value = WBmoto.Worksheets(1).Range("AB15:AB22").Value

WBsaki.Worksheets(1).Range("A58:A65").Value = WBmoto.Worksheets(1).Range("AD15:AD22").Value
WBsaki.Worksheets(1).Range("B58:B65").Value = WBmoto.Worksheets(1).Range("AE15:AE22").Value
WBsaki.Worksheets(1).Range("C58:C65").Value = WBmoto.Worksheets(1).Range("A14").Value
WBsaki.Worksheets(1).Range("D58:D65").Value = WBmoto.Worksheets(1).Range("AJ15:AJ22").Value
WBsaki.Worksheets(1).Range("E58:E65").Value = WBmoto.Worksheets(1).Range("AK15:AK22").Value
・ツリー全体表示

【81461】指定フォルダ内最新ファイル名の転記(連...
質問  V  - 20/8/17(月) 22:53 -

引用なし
パスワード
   勉強不足で申し訳ありません
繰り返し処理について教えてください。

列B8〜にフォルダ保存バスが入っています。
列C8〜に列Bで指定したフォルダに存在するファイルの内
最新(直近に作成された)のファイル名を
表示させたいといろいろなサイトを検索して
以下を作りました。

Sub ファイル名転記()
Dim fso, fol, fc, f1, f2
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(Cells(8, 2))
Set fc = fol.Files

For Each f1 In fc
If IsEmpty(f2) = True Then
Set f2 = fso.GetFile(f1)
End If
If f1.DateLastModified > f2.DateLastModified Then
Set f2 = fso.GetFile(f1)
End If
Next
Cells(8, 3).Value = f2.Name
End Sub

これをB列にデータがあれば全てのC列に自動的にデータが転記されるようにしたいと
以下のとおり作ってみましたが、全く反応しませんでした、
どのように作り替えればよいのか、どなたかご教授頂けませんでしょうか。
どうぞよろしくお願いします。

Sub 連続ファイル名転記()
Dim i As Long
Dim MaxRow As Long
MaxRow = Sheets("添付書類").Cells(Rows.Count, 2).End(xlUp).Row

For i = 1 To MaxRow
Dim fso, fol, fc, f1, f2
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(Cells(i, 2))
Set fc = fol.Files
For Each f1 In fc
If IsEmpty(f2) = True Then
Set f2 = fso.GetFile(f1)
End If
If f1.DateLastModified > f2.DateLastModified Then
Set f2 = fso.GetFile(f1)
End If
Next
Cells(i, 3).Value = f2.Name
Next i
End Sub 
・ツリー全体表示

【81460】Re:セルの保護について
お礼  takumi  - 20/8/17(月) 14:18 -

引用なし
パスワード
   ▼マナ さん:
解決しました!
ありがとうございます!!


>▼takumi さん:
>
>>どうすれば常に3行目のみロックを外すことができますでしょうか。】
>
>毎回、全セルロックしてから、
>3行目のみロックを解除
>
>With ActiveSheet
>  .Unprotect
>  .Rows(3).Insert
>  .Cells.Locked = True
>  .Rows(3).Locked = False
>  .Protect
>End With
・ツリー全体表示

【81459】APIの引数へVBAからnull 及び構造体を入...
質問  作業者A  - 20/8/17(月) 12:19 -

引用なし
パスワード
   win64APIの引数へVBAからnull 及び構造体を入れる方法を教えてください。

win64APIのSetupDiGetDeviceInterfaceDetail第3引数はNullと構造体で機能が違います。
VBAからこの第3引数へnull または構造体を入れる方法を教えてください。

Private Declare PtrSafe Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" _
  Alias "SetupDiGetDeviceInterfaceDetailA" ( _
  ByVal DeviceInfoSet As LongPtr, _
  ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA, _
  ByRef DeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA, _ ←第3引数
  ByVal DeviceInterfaceDetailDataSize As Long, _
  ByRef RequiredSize As Long, _
  ByVal DeviceInfoData As String _  ←Null固定なのでstring宣言でVbnullstringを入れる
) As Boolean

C#ならばintptr.zeroを使いますが,VBAはvbnullstringを使うために第3因数を文字列にしなければなりません。
ByVal DeviceInterfaceDetailData As String, _ ←第3引数
これでvbnullstringを入れると機能は動作します。
すると次に構造体を引き渡す方法がわかりません。

仮に構造体宣言のままで DeviceInterfaceDetailDataへ構造体を引き渡すと必ず以下のエラーが返ってきます。
「ERROR_INVALID_USER_BUFFER 1784 0x6F8 要求された操作に対して与えられたバッファーが無効です。」

試しに
Call ZeroMemory(sDeviceInterfaceDetailData, 8)で構造体を初期化してみましたが同じエラーでした。

このようなAPIの引数渡し方法をお教えください。
・ツリー全体表示

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