Excel VBA質問箱 IV

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

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


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

【77277】Re:ラジオボタン
お礼  ぴょん  - 15/6/28(日) 21:31 -

引用なし
パスワード
   マナ さん、βさんありがとうございました。

プロパティウィンドウのGroupNameで、実現できました。m(_ _)m
・ツリー全体表示

【77276】Re:ラジオボタン
発言  β  - 15/6/28(日) 18:58 -

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

とりあえずは、AとBをグルーピングしましょう。
Aを右クリック、プロパティを選んで、GroupName に、たとえば AB。
Bに対しても同様に。

これで、あ、い と A,B が別グループになり、それぞれのグループ内での二者択一になります。

とりあえずとコメントしたのは、A,Bが あ 選択時のみ有効にしたいということで
そうするためには、もう一工夫必要ですが。
・ツリー全体表示

【77275】Re:ラジオボタン
発言  マナ  - 15/6/28(日) 18:33 -

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

プロパティウィンドウにGroupNameというのがありませんか。
・ツリー全体表示

【77274】ラジオボタン
質問  ぴょん  - 15/6/28(日) 17:17 -

引用なし
パスワード
   ちょと、初歩的ですいませんが質問させてください。

ワークシートのActivexコントロールのラジオボタンを使用して、以下のように動作させたいのですが、うまくいきません。

”あ”と”い”は排他関係にあり、”あ”のラジオボタン押下時に、AかBを押下させ下記状態としたい。

●あ
 ○A
 ●B
○い

現在は、”あ”が○になってしまいます。
(あ、い、A、Bの4つのうち、いずれか一つしか選択できないです)

○あ
 ○A
 ●B
○い

以上、よろしくお願いします。
・ツリー全体表示

【77273】Re:パスワードでロック
発言  β  - 15/6/28(日) 6:18 -

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

>auto_openは、Sheetモジュール、標準モジュール、ThisWorkbookモジュール
>何処に書いても良いのですか?

ThisWorkbookモジュールのWorkbook_Open、標準モジュールの Auto_Open いずれも
ブックが開かれたときに自動実行されます。
これらのプロシジャは、それ以外のモジュールに書いても機能しません。

なお、Auto_Open は、別ブックのマクロから、このマクロブックが開かれた場合は機能しません。(自動実行されません)
Workbook_Openのほうは、その場合にも自動実行されますので、こちらを使うのが一般的ですね。
Auto_Open は、やや、古い手法。いずれにしても、どちらか一方にしたほうがいいですよ。

>質問1

>注文書E2,E4,G4は入力出来るようにしたいのです。

質問の意味がよくわかりませんので、ペつのポイントでメモします。(少し長くなりますが)

1.まず、シートの保護で、セルの入力を禁止するためには、その前に「セル書式のロック」を
 設定しなければいけません。別の言い方をすれば
 ・セル組織でセル保護(ロック)をしてもシート保護をしなければ有効にはなりません。
 ・また、セル保護(ロック)をはずすと、シート保護をかけても、そのセル入力が可能になります。
 まお、初期値、シート上の全セルの保護はロックに設定されています。

2.シート保護のダイアログ
 ・シートとロックされたセルの内容を保護する(C)
  ここにチェックをいれなければシート保護操作そのものができません。
  マクロコードとしては、Contents:=True ですが、逆にいえば、操作で設定すれば Contents:=False にはなりません。
  Contents:=False は、セルロックがかかっていてもかかっていなくても、入力が可能というシート保護。
  ですからマナさん指摘のとおり「意味がないですね。」ということになります。
 ・操作者に許可する、ロックされたセル、されていないセルの範囲の選択可否は以下の組み合わせのみ
  ロックされたセル範囲の選択     チェック  チェックなし  チェックなし
  ロックされていないセル範囲の選択  チェック  チェックなし  チェック
  初期値として表示されるのは両方にチェックがついた形ですね。 で、ここでの選択結果は Protectメソッドコードには
  あらわれません。
  その組み合わせに従って、シート.EnableSelection = 選択された組み合わせ条件 というコードになります。
  (両方チェックすれば、デフォルトの NoRistriction になりますが、マクロ記録では生成されません)

3.マクロ内でのProtectメソッドの留意点
  シート保護のダイアログには操作者に許可する様々な操作の選択ができます。
  で、UserInterface付保護であろうが、保護解除後の再保護であろうが、マクロでのProtectメソッドは
  【それぞれの条件を、引数としてコード内で指定】することが必要です。
  別の言い方をすれば【指定しない条件】については、【エクセルが定めたデフォルト】になってしまうということです。
  エクセルが定めたデフォルトは、まっさらなシートでシート保護ダイアログを表示した時の状態、つまり
  【すべての操作を許可しない】ということになります。
  かりに、並び替えOKという設定がされていたとしても、マクロで AllowSorting:=True と明記しなければ
  そのあと、操作者が並び替えをしようとしてもできなくなります。【要注意】です。
  以下のいずれかにする必要があります。
 ・操作で保護した時の条件を、その通りにすべて記述
 ・あるいは、すべての条件に対して、操作で設定されている値を引き継ぐ
・ツリー全体表示

【77272】Re:パスワードでロック
質問  翔子  - 15/6/28(日) 2:31 -

引用なし
パスワード
   β 様

ThisWorkbookモジュールに

Private Sub Workbook_Open()
  '注文書シートロック UserInterfeceOnly付
  Sheets("注文書").Protect Password:="111", DrawingObjects:=True, _
      Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
End Sub
確かに楽ですね。勉強になりました。

質問1
注文書E2,E4,G4は入力出来るようにしたいのです。

質問2

標準モジュールに以下のモジュール
Sub auto_open()
  Sheets("注文書").Select
    Range("A1").Value = Date
End Sub
を書いたら、ちゃんと日付がでました。

auto_openは、Sheetモジュール、標準モジュール、ThisWorkbookモジュール
何処に書いても良いのですか?
・ツリー全体表示

【77271】Re:パスワードでロック
質問  翔子  - 15/6/27(土) 23:23 -

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

Contents:=True
でした。

>ご提示の詳細から注文書へ転記するマクロについては、
>シート保護を解除しなくても実行可能なのになぜ?
>という疑問もありましたので、念のため確認です。

保護、解除は後からつけたのです。
最初に、詳細から注文書へ転記するマクロっを書いて

詳細シートを一般機能で保護。
注文書へ転記するのに、何故か保護解除しなくても転記できてしまいまして
・ツリー全体表示

【77270】Re:オートフィルターを実行後の矢印ボタ...
お礼  ぴょん  - 15/6/27(土) 18:27 -

引用なし
パスワード
   マナ さん

下記追加して実行したら、うまくいきました。
ありがとうございました、大変助かりました。
駆け出しなもので、またよろしくお願いします。

>Range("D3", Range("D" & Rows.Count).End(xlUp)).AutoFilter
>
>これでどうなりますか。
・ツリー全体表示

【77269】Re:オートフィルターを実行後の矢印ボタ...
発言  マナ  - 15/6/27(土) 17:14 -

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

Range("D3", Range("D" & Rows.Count).End(xlUp)).AutoFilter

これでどうなりますか。
・ツリー全体表示

【77268】オートフィルターを実行後の矢印ボタンの...
質問  ぴょん  - 15/6/27(土) 16:44 -

引用なし
パスワード
   D列に絞り込み対象
1〜3行目は固定域
4行目以降がデータ域

  A   B  C  D  E  F
1  タイトル等の固定域1
2  タイトル等の固定域2
3  タイトル等の固定域3
4  A4   B4  C4  D4  E4  F4
5  A5   B5  C5  D5  E5  F5

オートフィルタで絞り込んだ結果を表示したまま、オートフィルタの矢印ボタンを非表示にするべく、下記コーディングにしたのですが、
Columns("D:D").AutoFilter
Field:=1,
Criteria1:="ABC",
VisibleDropDown:=False
実行すると固定域が潰されてしまいます。

  A   B  C  D  E  F
1  A4   B4  C4  D4  E4  F4
2  A5   B5  C5  D5  E5  F5

固定域が潰れないようにするには、どのようにすれば良いでしょうか?
・ツリー全体表示

【77267】Re:シートをまとめる
発言  kanabun  - 15/6/27(土) 15:30 -

引用なし
パスワード
   ▼エクセル勉強中 さん:

>ちなみにA列の日付のところは直接手入力で打ち込んでいます。

A列データがある行だけ、なら、先ほどの tryB() のほうは
こんな感じになります。

Sub tryB()
 Dim wsまとめ As Worksheet
 Dim ws As Worksheet
 
 Set wsまとめ = Worksheets("集約") 'まとめ用シート
 For Each ws In Worksheets
  If ws.Name <> wsまとめ.Name Then
    ws.Range("A17", ws.Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).Copy
    wsまとめ.Cells(Rows.Count, 2).End(xlUp).Offset(1, -1) _
     .PasteSpecial xlPasteValues
  End If
 Next

End Sub

なお、このコードは 同じBookのなかに 集約用のシートが1枚入っていて、
1行目に、列見出しが

   A    B     C       D    E   F    G
1  日付  コード  商品名     価格 出庫数 単位  金額

のように書き込んであることを仮定しています。
また、その集約用シート名は ここでは「集約」としています。
・ツリー全体表示

【77266】Re:シートをまとめる
発言  エクセル勉強中  - 15/6/27(土) 15:21 -

引用なし
パスワード
   おっしゃる通りA列B列には式は入ってないのですが、
コードが無く直接商品名を手入力する場合がありますのでc列のところから最終行を求めたいです
ちなみにA列の日付のところは直接手入力で打ち込んでいます。
・ツリー全体表示

【77265】Re:シートをまとめる
発言  β  - 15/6/27(土) 15:09 -

引用なし
パスワード
   ▼エクセル勉強中 さん:

コピー先ブックの状態のみならず、コピー元ブックの状態、
特にそこにある式がコピペでOKなものなのかどうか不透明な部分が少なくないのですが
とりあえず。

DeskTopにあるエクセルブックを読みこみ、各ブックの最初のシートのデータを
マクロブックの最初のシートにコピペします。

Sub Test集約()
  Dim fPath As String
  Dim fName As String
  Dim fSh As Worksheet
  Dim tSh As Worksheet
  Dim z As Long
  
  Application.ScreenUpdating = False
  
  Set tSh = ThisWorkbook.Sheets(1)
  fPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\Test\"
  
  fName = Dir(fPath & "*.xls*")
  
  Do While fName <> ""
    If fName <> ThisWorkbook.Name Then '念のため
      Set fSh = Workbooks.Open(fPath & fName).Sheets(1)
      z = fSh.Columns("C").Find(What:="*", LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlPrevious, After:=fSh.Range("C" & Rows.Count)).Row
      If z > 17 Then
        Range("A17:J" & z).Copy tSh.Range("C" & Rows.Count).End(xlUp).Offset(1).Offset(, -2)
      End If
      fSh.Parent.Close False
    End If
    fName = Dir()
  Loop
    
End Sub
・ツリー全体表示

【77264】Re:シートをまとめる
発言  kanabun  - 15/6/27(土) 14:29 -

引用なし
パスワード
   >で、A列とか B列は そうではなく、上から手入力していて、たとえば、
>↓の例ですと、[B23]から下は 空白セル(数式も入っていない) なのでは?
>
>   A    B     C       D    E   F    G
>16 日付  コード  商品名     価格 出庫数 単位  金額
>17     1015   SuperDry    800   100  本  80000
>18     1016   黒ラベル    800   55  本  44000
>19     1059   白岳仙     1000    3  本  3000
>20     1066   黒龍      1000    4  本  4000
>21     1024   梅酒な     450    5  本  2250
>22     1055   一本義     1000    4  本  4000
>23          =If(B23="","",...)
>24          =If(B24="","",...)
>25          =If(B25="","",...)
> :
> :
>114         =If(B114="","",...)

B列に着目すれば、値が入っている行だけを直接コピーしてしまえばよいので
簡単です。

Sub tryB()
 Dim wsまとめ As Worksheet
 Dim ws As Worksheet
 
 Set wsまとめ = Worksheets("集約") 'まとめ用シート
 For Each ws In Worksheets
  If ws.Name <> wsまとめ.Name Then
    ws.Range("B17", ws.Cells(Rows.Count, 2).End(xlUp)) _
     .Offset(, -1).Resize(, 7).Copy
    wsまとめ.Cells(Rows.Count, 2).End(xlUp).Offset(1, -1) _
     .PasteSpecial xlPasteValues
  End If
 Next

End Sub
・ツリー全体表示

【77263】Re:シートをまとめる
発言  kanabun  - 15/6/27(土) 14:22 -

引用なし
パスワード
   AutoFilter案ですが、
もう少し具体例を示すと、
あるBookに 何十枚もの同じ形式のシートがあり、シートの1枚が「集約」という
名前のシートで、ここに他のシートのデータを集約するとすると、
こんな感じになります。

Sub tryAutoFilter()
 Dim wsまとめ As Worksheet
 Dim ws As Worksheet
 
 Set wsまとめ = Worksheets("集約") 'まとめ用シート
 For Each ws In Worksheets
  If ws.Name <> wsまとめ.Name Then
   With ws.Range("C16", ws.Cells(Rows.Count, "C").End(xlUp)) _
    .Offset(, -2).Resize(, 7)
      'データがある行だけを まとめ用シートに一括転記
      .AutoFilter Field:=3, Criteria1:="<>"
      If .Columns(1).SpecialCells(xlVisible).Count > 1 Then
          Intersect(.Cells, .Offset(1)).Copy _
         wsまとめ.Cells(Rows.Count, 2).End(xlUp).Offset(1, -1)
      End If
      .AutoFilter
   End With
  End If
 Next
End Sub
・ツリー全体表示

【77262】Re:シートをまとめる
発言  kanabun  - 15/6/27(土) 14:07 -

引用なし
パスワード
   ▼エクセル勉強中 さん:

>>>=IF(B22="","",VLOOKUP(B22,'C:\新しい伝票フォルダ\[伝票加藤10.xlsx]販売価格表'!$A$1:$K$2001,2,))
>この様さ式が下まで入っています

C列はそのように 114行目まで数式がはいっています。
で、A列とか B列は そうではなく、上から手入力していて、たとえば、
↓の例ですと、[B23]から下は 空白セル(数式も入っていない) なのでは?

   A    B     C       D    E   F    G
16 日付  コード  商品名     価格 出庫数 単位  金額
17     1015   SuperDry    800   100  本  80000
18     1016   黒ラベル    800   55  本  44000
19     1059   白岳仙     1000    3  本  3000
20     1066   黒龍      1000    4  本  4000
21     1024   梅酒な     450    5  本  2250
22     1055   一本義     1000    4  本  4000
23          =If(B23="","",...)
24          =If(B24="","",...)
25          =If(B25="","",...)
:
:
114         =If(B114="","",...)
・ツリー全体表示

【77261】Re:シートをまとめる
発言  エクセル勉強中 E-MAIL  - 15/6/27(土) 12:15 -

引用なし
パスワード
   ▼kanabun さん:
>▼エクセル勉強中 さん:
>
>>=IF(B22="","",VLOOKUP(B22,'C:\新しい伝票フォルダ\[伝票加藤10.xlsx]販売価格表'!$A$1:$K$2001,2,))
この様さ式が下まで入っています
・ツリー全体表示

【77260】Re:シートをまとめる
発言  kanabun  - 15/6/27(土) 11:26 -

引用なし
パスワード
   ▼エクセル勉強中 さん:

> その100枚のシートを一つのシートにまとめたい


> まとめ方
> 範囲
> 列はA16からJ16

> A16行は見出しなのでコピーは不要

フィルタを使ってコピーする案です。

Sub tryA()
  With Range("C16", Cells(Rows.Count, "C").End(xlUp)) _
   .Offset(, -2).Resize(, 7)
     .Select        '確認用
     .AutoFilter Field:=3, Criteria1:="<>"
     If .Columns(1).SpecialCells(xlVisible).Count > 1 Then
       '確認用
       If MsgBox("Copyしますか?", vbOKCancel) = vbOK Then
         Intersect(.Cells, .Offset(1)).Select '確認用
         MsgBox "この範囲を別シートへコピーします"
       End If
     End If
     .AutoFilter
  End With
End Sub

でも、A列もB列も 114行まで 数式が入っているんですか?
どんな式でしょう?
・ツリー全体表示

【77259】Re:シートをまとめる
発言  β  - 15/6/27(土) 5:52 -

引用なし
パスワード
   ▼エクセル勉強中 さん:

C列のデータ最終行を取得する上でのヒントコードです。

Sub Test()
  MsgBox Range("C" & Rows.Count).End(xlUp).Row
  MsgBox Columns("C").Find(What:="*", LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlPrevious, After:=Range("C" & Rows.Count)).Row
End Sub
・ツリー全体表示

【77258】シートをまとめる
質問  エクセル勉強中 E-MAIL  - 15/6/27(土) 1:02 -

引用なし
パスワード
   1  A     B     C      D     E        F    G     H   I    J   
2 宴会名                                    
3 日付                                    
4 入力者                                    
5 備考                                    
6                                    
7                                    
8     部屋1    部屋2    部屋3    部屋4    部屋5    部屋6    部屋7    部屋8    部屋9
9 部屋名                                    
10 人  数                                    
11 宴席目的                                    
12 宴席形式                                    
13 開始時間                                    
14 終了時間                                    
15TOTAL                        137,250円            
16日付    コード    商品名    販売価格    出庫数    単位    合計    種類    部屋    備考
17    1015    アサヒ スーパードライ    800円    100    本    80,000円    ドリンク        
18    1016    サッポロ 黒ラベル    800円    55    本    44,000円    ドリンク        
19    1059    白岳仙    1,000円    3    合    3,000円    ドリンク        
20    1066    黒龍 純米吟醸    1,000円    4    合    4,000円    ドリンク        
21    1024    まるで梅酒なノンアルコール    450円    5    本    2,250円    ドリンク        
22    1055    一本義 上撰本醸造(赤)    1,000円    4    合    4,000円    ドリンク        
                                    
エクセル初心者です
この様なブックが月事に100ぐらい出来てきます((sheet1)しか記入されていない)
参考書を読むなりして1つのブックのシートにまとめる事はできたのですが、
その100枚のシートを一つのシートにまとめたい


まとめ方
範囲
列はA16からJ16
行はイフ関数の式が入っていてRange("c1").End(xlDown).Row←あえて(C1)では空白のセルで値の入っていないセルを最終行にかえしてしまう(if関数の式は114行まで入っているのでそこで止まってしまう)←ここがどう書けばいいか1番解らない
ので値の入った所までを範囲としたい
後は集計のシートに上から1つのシートごとにコピーしていく
A16行は見出しなのでコピーは不要
お手数ですがよろしくお願いします
・ツリー全体表示

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