Excel VBA質問箱 IV

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

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


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

【79987】Re:行の表示非表示
お礼  ACE  - 18/6/12(火) 7:02 -

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

ばっちりでした。
ありがとうございました。
・ツリー全体表示

【79986】Re:エラーが出てしまいます。どこを修正...
質問  KAZUE  - 18/6/12(火) 5:56 -

引用なし
パスワード
   ▼マナ さん:
早速ありがとうございます。

r(i, 3) と r(i, 5)にカーソルを合わせると
確かに文字が表示されるのですが、実際にExcelの
画面では数値なので、そこも不明な事と、
シートの指定で「With sh2」と入れると
これもエラーになってしまってどこをどうしていいのか
困り果てている状況です。

ここで教えていただくのに
不足している物が何かありますでしょうか。

本当に初心者ですみません。
・ツリー全体表示

【79985】Re:行の表示非表示
回答  γ  - 18/6/12(火) 5:17 -

引用なし
パスワード
   For i = 11 To 160 Step 3
としてみては?
・ツリー全体表示

【79984】行の表示非表示
質問  ACE  - 18/6/11(月) 23:41 -

引用なし
パスワード
   行の表示非表示で質問です。

H11:J13,H14:J16,H17:J19,H20:J22・・・H158:J160の3行毎の結合セルです。

H11が空白なら11行から13行が非表示、空白でなければ表示
H14が空白なら14行から16行が非表示、空白でなければ表示
H17が空白なら17行から19行が非表示、空白でなければ表示

この処理をH158まで行いたいのですがうまくいきません。

コードのどこを修正すれば良いのでしょうか?
どなたか教えて下さいませ。

以下コードです。

Private Sub Worksheet_Activate()
 Dim i As Long 
 For i = 11 To 160
  If Cells(i, 8) = "" Then
   Rows(i & ":" & i + 2).Hidden = True
  Else
   Rows(i & ":" & i + 2).Hidden = False
  End If
 Next
End Sub
・ツリー全体表示

【79983】Re:エラーが出てしまいます。どこを修正...
発言  マナ  - 18/6/11(月) 21:46 -

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

>「 '小計」の部分の「 r(i, 6) = r(i, 3) * r(i, 5)」まで来ると
>実行時エラー13 型が一致しません。と出てしまいます。

r(i, 3) と r(i, 5)には何が入っているか
確認してみましたか。

ところで、関係ないかもしれませんが
小計のブロックだけ、シートが指定されていませんが大丈夫でしょうか。


> '小計
> Dim r As Range
> Range("C2").Resize(2).ClearContents
> With Range("B12", Cells(Rows.Count, "B").End(xlUp))
・ツリー全体表示

【79982】Re:SendMessageで全角文字を書き込むには
質問  山田  - 18/6/11(月) 21:41 -

引用なし
パスワード
   FindWindowExでテキストボックスを探そうとしましたがうまくいきません。
クラス名"Edit"では見つかりませんでした。
クラス名がわからないテキストボックスのハンドルを取得するにはどうしたらいいでしょうか。
・ツリー全体表示

【79981】エラーが出てしまいます。どこを修正した...
質問  KAZUE  - 18/6/11(月) 20:53 -

引用なし
パスワード
   VBAの勉強を始めたばかりなのですが、
仕事で必要になり色々教えていただき以下のようにできたのですが、

「 '小計」の部分の「 r(i, 6) = r(i, 3) * r(i, 5)」まで来ると
実行時エラー13 型が一致しません。と出てしまいます。
ちなみに小計を出したいのは、 Set sh2 = Worksheets("明細書")の
シートなのですが、どこを修正していいのかわかりません。

どなたか、教えていただけますでしょうか。


Sub サンプル()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim sdate As String, edate As String
Dim date1 As Date, date2 As Date
Dim i As Long, imax As Long, j As Long
 Dim place As String
sdate = InputBox("開始日を yyyy/m/d の形式で入力して下さい")
If sdate = "" Then Exit Sub
If IsDate(sdate) = False Then
MsgBox "日付エラー"
Exit Sub
End If
edate = InputBox("終了日を yyyy/m/d の形式で入力して下さい")
If edate = "" Then Exit Sub
If IsDate(edate) = False Then
MsgBox "日付エラー"
Exit Sub
End If
date1 = DateValue(sdate)
date2 = DateValue(edate)
If date1 > date2 Then
MsgBox "開始日>終了日 エラー"
Exit Sub
End If
Application.ScreenUpdating = False
Set sh1 = Worksheets("作業シート")
Set sh2 = Worksheets("明細書")


'初期化
With sh1
If .Range("A1").Value <> "" Then
.Range("A5:Z" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
End If
End With
With sh2
If .Range("B7").Value <> "" Then '**
.Range("A7:J" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
  End If
End With


'抽出
With Worksheets("データ")
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Range("A" & i).Value >= date1 And .Range("A" & i).Value <= date2 Then
j = j + 1
.Range("A" & i & ":X" & i).Copy Destination:=sh1.Range("A" & j)
End If
Next i
End With


'明細書作成
j = 9
With sh1
imax = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("A1:X" & imax).Sort Key1:=.Range("C1"), Order1:=xlAscending, Key2:=.Range("A1"), order2:=xlAscending
 For i = 1 To imax
If .Range("C" & i).Value <> place Then
j = j + 3
 sh2.Range("B" & j).Value = "【" & .Range("C" & i).Value & "】"
place = .Range("C" & i).Value
 svdate = 0
End If
j = j + 1
If .Range("A" & i).Value <> svdate Then
sh2.Range("A" & j).Value = .Range("A" & i).Value
sh2.Range("A" & j).NumberFormatLocal = "m/d"
svdate = .Range("A" & i).Value
svdate = .Range("A" & i).Value
End If
sh2.Range("B" & j).Value = .Range("D" & i).Value & " No." & .Range("P" & i).Value
sh2.Range("C" & j).Value = .Range("Q" & i).Value
sh2.Range("D" & j).Value = .Range("F" & i).Value
sh2.Range("E" & j).Value = .Range("O" & i).Value
sh2.Range("F" & j).Value = .Range("X" & i).Value
sh2.Range("J" & j).Value = .Range("R" & i).Value
Next i
End With


'小計
Dim r As Range
Range("C2").Resize(2).ClearContents
With Range("B12", Cells(Rows.Count, "B").End(xlUp))
For Each r In .SpecialCells(xlCellTypeConstants).Areas
r(r.Count + 1) = "小計"
For i = 2 To r.Count
r(i, 6) = r(i, 3) * r(i, 5)
r(i, 7) = r(i, 6) * 0.08
r(i, 8) = r(i, 2) + r(i, 6) + r(i, 7)
Next
r(r.Count + 1, 2) = Application.Sum(r.Offset(, 1))
r(r.Count + 1, 6) = Application.Sum(r.Offset(, 5))
r(r.Count + 1, 7) = Application.Sum(r.Offset(, 6))
r(r.Count + 1, 8) = Application.Sum(r.Offset(, 7))
Next r
End With


Application.ScreenUpdating = True
sh2.Select
End Sub
・ツリー全体表示

【79980】Re:別々のシートにある列の結合 VBA
お礼    - 18/6/10(日) 22:21 -

引用なし
パスワード
   γ 様 マナ様


ご教授いただきありがとうございました。
一つの実行でも、いろいろなやり方があり、最後はあそこまで短くできるのですね。ほんとすばらしいです。勉強になりました。

また、「自分でここまで考えたということを示してから、ご教授いただくことがマナーであること」に気づかせていただきありがとうございました。
以後気をつけたいと思います。
・ツリー全体表示

【79979】Re:SendMessageで全角文字を書き込むには
回答  よろずや  - 18/6/10(日) 15:34 -

引用なし
パスワード
   ht tp://d.hatena.ne.jp/maeyan/20091227/1261936878
・ツリー全体表示

【79978】SendMessageで全角文字を書き込むには
質問  山田  - 18/6/10(日) 15:06 -

引用なし
パスワード
   他のアプリケーションのテキストボックスに全角文字を書き込もうとしています。

SendMessageを使いWM_IME_CHARで半角1文字ずつだと書き込めるのですが、
WM_SET_TEXTだと書き込めません。

SendMessage(hWnd, WM_SETTEXT, 0, "漢字")
だとアプリのタイトルバーが”漢字”になってしまいます。

テキストボックスに全角文字を書き込むにはどうしたらいいでしょうか。
・ツリー全体表示

【79977】Re:レジストリについて。
お礼  瞬希  - 18/6/10(日) 13:44 -

引用なし
パスワード
   皆様ありがとうございました。

ネットで調べ、もう一度良く見直して考え解決いたしました。
アドバイス、ご教授の程大変ありがとうございました。

大変勉強になりました、失礼致します。
・ツリー全体表示

【79976】Re:レジストリについて。
お礼  瞬希  - 18/6/10(日) 12:18 -

引用なし
パスワード
   ▼γ さん:
>>「登録されている拡張子は表示しない」をチェックを外して使用しています
>>(拡張子を表示させてしまいます)
>そちらのほうが正しい対応だと思います。
>よろずやさんに追加で1票。

γ さん
ありがとうございます。

うーん、拡張子を表示させて使用される方の方が多いのでしょうか・・・。
一応、皆さんの意見に従おうと思います。

いまイロイロ調べてはいますが、このまま中途半端になるのも気持ち悪いので・・・。

参考までにご教授いただけないでしょうか?
・ツリー全体表示

【79975】Re:早急で御座います!
発言  γ  - 18/6/10(日) 12:16 -

引用なし
パスワード
   別の掲示板で解決済みになっているようです。
こちらにもその旨コメントすべきですよね。
適切な回答が寄せられているわけですから、礼をするのが普通じゃないですか?

事情を知らない人がこれから時間を費やしてしまうことは無駄なこと。
そもそもを申し上げれば、
・なぜそんなことが早急なんですか?
 急ぎだったら手作業でやればいい。
・タイトルは内容を表すものにするのが常識です。
・もともとSendKeysで他のアプリケーションを操作するのは
 不安定だし、できることに限度があるので避けるべき。
 この程度であれば可能だが、メモ帳の特定の位置を指定して
 作業をしたい、などは困難になる。

早急などという方に限って、投稿しっぱなしになるのはよく観察されることでは
あるが、やはりマナーを守って頂きたいですね。
(自分勝手ということでは首尾一貫しているとも言えますが。)
・ツリー全体表示

【79974】Re:レジストリについて。
発言  γ  - 18/6/10(日) 12:00 -

引用なし
パスワード
   >「登録されている拡張子は表示しない」をチェックを外して使用しています
>(拡張子を表示させてしまいます)
そちらのほうが正しい対応だと思います。
よろずやさんに追加で1票。
・ツリー全体表示

【79973】Re:別々のシートにある列の結合 VBA
発言  γ  - 18/6/10(日) 11:51 -

引用なし
パスワード
   (1)Selectをできるだけしないようにするとこのように短縮できます。

Sub test2()
  Sheets(1).Columns("A:A").Copy
  Worksheets(Worksheets.Count).Columns("A:A").PasteSpecial Paste:=xlPasteValues
  
  Sheets(2).Columns("A:A").Copy
  Worksheets(Worksheets.Count).Columns("B:B").PasteSpecial Paste:=xlPasteValues
  
  Sheets(3).Columns("A:A").Copy
  Worksheets(Worksheets.Count).Columns("C:C").PasteSpecial Paste:=xlPasteValues
End Sub
------------------------------
シートを変数化すると短くなります。
そして、Columns("A:A")はColumns(1)とも書けます。

Sub test3()
  Dim ws As Worksheet
  Set ws = Worksheets(Worksheets.Count)
  
  Sheets(1).Columns(1).Copy
  ws.Columns(1).PasteSpecial Paste:=xlPasteValues
  
  Sheets(2).Columns(1).Copy
  ws.Columns(2).PasteSpecial Paste:=xlPasteValues
  
  Sheets(3).Columns(1).Copy
  ws.Columns(3).PasteSpecial Paste:=xlPasteValues
End Sub
------------------------------
これを繰り返し構文For .. Nextを使って書くと、こうなります。

Sub test4()
  Dim ws As Worksheet
  Dim k As Long
  
  Set ws = Worksheets(Worksheets.Count)
  For k = 1 To 3
    Sheets(k).Columns(1).Copy
    ws.Columns(k).PasteSpecial Paste:=xlPasteValues
  Next
End Sub

参考にしてみて下さい。
・ツリー全体表示

【79972】Re:レジストリについて。
お礼  瞬希  - 18/6/10(日) 11:20 -

引用なし
パスワード
   ▼よろずや さん:
>>「登録されている拡張子は表示しない」をチェックを外して使用しています
>マクロやレジストリを理解してるなら、「登録されている拡張子は表示しない」とする危険性も理解できると思うのですが...
>勝手に戻されたら、私なら怒りますよ。

よろずやさん
ありがとうございます、確かに人それぞれ使い方があるのはもちろん分かっています。
もちろん、そこのところは理解済みです。

たまたま都合が悪いのは、数人での共有PCなので困っています。

「私が使用する時」だけ、変更したい次第です。

アドバイス頂けると幸いです、宜しくお願い致します。
・ツリー全体表示

【79971】Re:レジストリについて。
発言  よろずや  - 18/6/10(日) 11:12 -

引用なし
パスワード
   >「登録されている拡張子は表示しない」をチェックを外して使用しています
マクロやレジストリを理解してるなら、「登録されている拡張子は表示しない」とする危険性も理解できると思うのですが...
勝手に戻されたら、私なら怒りますよ。
・ツリー全体表示

【79970】レジストリについて。
質問  瞬希  - 18/6/10(日) 9:25 -

引用なし
パスワード
   おはようございます、また皆様のお知恵をお貸しください。

当方、会社で1台のPCを数人で入れ替わり使用する仕事があるのですが、ある方が「フォルダーオプション」の「表示」タブから「登録されている拡張子は表示しない」をチェックを外して使用しています(拡張子を表示させてしまいます)。

元に戻して。と言えば良いだけなのでしょうが、なんとなく言い辛いです(説明が難しいですが・・・)、自分で非表示にするのも結構大変で・・・。

私が、常に使用するエクセルブックがあるためマクロで拡張子を非表示にしたと考えています。
ネットなどを見て周り、見よう見まねで状態が「表示」なのか?「非表示」なのか?までは取得できるようになったのですが書き換えが上手くできません。

どこが間違っているのか?足りない部分等、教えていただけると幸いです。

環境はwin7/Excel2013となっています。

'☆☆☆☆拡張子の表示/非表示関連☆☆☆☆
'キーアクセスオプションを定義する為に必要
Private Const KEY_SET_VALUE = &H2 'サブキーの書き込みを許可

Public Const ERROR_SUCCESS = 0 'エラー無し
Public Const HKEY_CURRENT_USER = &H80000001 '現在のユーザーの設定に対するHKEY_USERのリンク
Public Const KEY_QUERY_VALUE = &H1& 'サブキーの値の参照を許可
Public Const REG_DWORD = 4 'ネイティブ形式の32ビット値

Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, _
ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long 'レジストリのサブキーのオープン

Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 'レジストリのサブキーのクローズ

Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, _
ByVal lpReserved As Long, lpType As Long, lpData As Any, _
lpcbData As Long) As Long 'サブキーの指定の値の取得

 Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
 (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
 ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long 'レジストリの書き換え
'☆☆☆☆拡張子の表示/非表示関連☆☆☆☆

Sub TEST_Folder_Option() 'フォルダオプションの変更

Dim lngKey As Long
Dim strSubKey As String
Dim lngResult As Long
Dim lngAnswer As Long '値(DWORDの値用)
Dim Size As Long
Dim strNewData As Long
Dim rc As Long

lngKey = HKEY_CURRENT_USER
strSubKey = "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"

rc = RegOpenKeyEx(lngKey, strSubKey, 0&, KEY_QUERY_VALUE, lngResult)

If rc <> ERROR_SUCCESS Then
MsgBox "関数の呼び出しに失敗しました"
  Exit Sub
End If

strSubKey = "HideFileExt"
rc = RegQueryValueEx(lngResult, strSubKey, 0&, REG_DWORD, lngAnswer, Len(lngAnswer))

'値の表示
'MsgBox lngAnswer
Size = Len(lngAnswer)
'MsgBox "+" & lngAnswer & "+"
  If lngAnswer <> 1 Then
    Debug.Print "拡張子は表示"
  '新しいデータに書き換え
    strNewData = "1"
    rc = RegSetValueEx(lngResult, strSubKey, 0&, REG_DWORD, strNewData, Size)
    
      If rc <> ERROR_SUCCESS Then
        MsgBox "書き込みに失敗しました。"
          Call RegCloseKey(lngResult)
            Exit Sub
      End If
    
  ElseIf lngAnswer = 1 Then
    Debug.Print "拡張子は非表示"
  End If
  
Call RegCloseKey(lngResult)

End Sub
・ツリー全体表示

【79969】Re:別々のシートにある列の結合 VBA
質問    - 18/6/9(土) 23:17 -

引用なし
パスワード
   マナ様 γ様

ご教授ありがとうございます。
記録したマクロをベースに、書き換えに挑戦してみません。お陰様で「A列の選択」「何番目のシート選択」と「最後のシート選択」の構文を覚えました。
ここまでの構文は下に貼り付けました。本当に、恥ずかしながらこの程度のレベルなのです。

ここで改めて質問です。
この後、約200シートを処理する際には、構文を200回コピーして、シートの選択の(数字)の書き換えと貼り付ける位置(Columns)の書き換えが必要を思われます。
 もっとすっきりした構文にしたいと思い、シートは、「次のシートを選択」にするといいのかと思い、(ActiveSheet.Next.Activate)に置き換えてみましたがうまくいきませんでした。「貼り付ける位置を右に一つずつずらす」に関しては、現在のところ検討もつかないところです。
 ご教授よろしくお願いいたします。


Sheets(1).Select
  Columns("A:A").Select
  Application.CutCopyMode = False
  Selection.Copy
  Worksheets(Worksheets.Count).Select
  Columns("A:A").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Sheets(2).Select
  Columns("A:A").Select
  Application.CutCopyMode = False
  Selection.Copy
  Worksheets(Worksheets.Count).Select
  Columns("B:B").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Sheets(3).Select
  Columns("A:A").Select
  Application.CutCopyMode = False
  Selection.Copy
  Worksheets(Worksheets.Count).Select
  Columns("C:C").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
・ツリー全体表示

【79968】Re:早急で御座います!
回答  亀マスター  - 18/6/8(金) 23:00 -

引用なし
パスワード
   SendKeysを使うなら
Ctrl+A→Ctrl+C→Del
を実行すればいいのでは?
・ツリー全体表示

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