Excel VBA質問箱 IV

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

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


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

【76591】Re:コンパクト化
質問  こずえ  - 15/1/23(金) 10:53 -

引用なし
パスワード
   kanabunさん βさん

大変お返事が遅くなりました。
色々、勉強をさせていだだきました。
有難うございました。

「【76585】コンパクト化 」で印刷と表記してある箇所を
ファームボタンで印刷をしたのですが、「印刷」の文字が
1〜2秒ほど関係ない所まで出てきまして、投稿をさせていただいたのです。

kanabunさん、βさんのモジュールは、印刷しても関係ない所まで出て
きませんでした。

何がいけなかったのでしょうか?
・ツリー全体表示

【76590】Re:コンパクト化
発言  kanabun  - 15/1/22(木) 23:11 -

引用なし
パスワード
   ごめんね、セル範囲がまちがってました m(_ _)m
ついでに、β さんのアドバイスにしたがって、複数セル範囲を一括クリア(Delete)
した場合にも対応するように、◆か所の Exit For をコメント化しておきます。

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim c As Range
 Dim r As Range
 Dim ss As String, zz As String
 Dim i As Long
  If Target.Column <> 3 Then Exit Sub
  
  zz = "C13:C14,C64:C65,C115:C116,C166:C167,C219:C220,"
  zz = zz & "C248:C249,C277:C278,C306:C307"
  ss = "CEGIDFHJ"
  For Each r In Range(zz).Areas
    i = i + 1
    If Not (Intersect(Target, r) Is Nothing) Then
      Set c = Worksheets("メニュー").Range(Mid$(ss, i, 1) & "10")
      If WorksheetFunction.CountBlank(r) = 2 Then
        c.ClearContents
      Else
        c.Value = "印 刷"
      End If
      'Exit For  '◆使わない
    End If
  Next
End Sub
・ツリー全体表示

【76589】Re:コンパクト化
発言  kanabun  - 15/1/22(木) 20:54 -

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


>こういう操作はしないとは思いますが、仮に、2組のセルに値が入っていて
>メニューシートに印刷が2か所記入されたとします。
>で、その2組のセルをともに選択してDeleteキーでクリアしたとします。
>そうすると、下のほうの組に対するメニューシートの 印刷 は残ったままになりませんか?

2組のセルをともに選択してクリアすれば、あとのほうは「残ったまま」になります。
つまり、そういう操作がない希望的観測のコードでした m(_ _)m
・ツリー全体表示

【76588】Re:コンパクト化
発言  β  - 15/1/22(木) 20:49 -

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

失礼します

こういう操作はしないとは思いますが、仮に、2組のセルに値が入っていて
メニューシートに印刷が2か所記入されたとします。
で、その2組のセルをともに選択してDeleteキーでクリアしたとします。
そうすると、下のほうの組に対するメニューシートの 印刷 は残ったままになりませんか?
・ツリー全体表示

【76587】Re:コンパクト化
発言  β  - 15/1/22(木) 20:19 -

引用なし
パスワード
   ▼こずえ さん:

これぐらいのセル数なら、すべてを毎回洗い替える、こんなコードでも。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range
  Dim c As Range
  Dim p As Range
  Dim x As Long
  
  Set r = Range("C13:C14,C64:C65,C115:C116,C166:C167,C219:C220,C248:C249,C277:C278,C306:C307")
  If Intersect(Target, r) Is Nothing Then Exit Sub
  With Sheets("メニュー")
    Set p = .Range("C10, E10, G10, I10, D10, F10, H10, J10")
    p.Value = Empty
  End With
  For Each c In r.Areas
    x = x + 1
    If WorksheetFunction.CountBlank(c) < 2 Then p.Areas(x).Value = "印刷"
  Next
      
End Sub
・ツリー全体表示

【76586】Re:コンパクト化
発言  kanabun  - 15/1/22(木) 17:56 -

引用なし
パスワード
   ▼こずえ さん:

>コンパクトにできますか?

コンパクトというか、現状のコードだと 「エネ」シートのどのセルが変化しても
Changeイベント・プロシージャ内の処理が走りますね?
それは無駄なことなので、C列の入力(あるいはクリア)でなければ、
チェックはしないことにしましょう。

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim c As Range
 Dim r As Range
 Dim ss As String, zz As String
 Dim i As Long
  If Target.Column <> 3 Then Exit Sub 'C列の Change でなければ抜ける
  
  zz = "C64:C65,C115:C116,C166:C167,C115:C116,"
  zz = zz & "C219:C220,C248:C250,C277:C278,C306:C307"
  ss = "CEGIDFHJ"
  For Each r In Range(zz).Areas
    i = i + 1
    If Not (Intersect(Target, r) Is Nothing) Then
      Set c = Worksheets("メニュー").Range(Mid$(ss, i, 1) & "10")
      If WorksheetFunction.CountBlank(r) = 2 Then
        c.ClearContents
      Else
        c.Value = "印 刷"
      End If
      Exit For
    End If
  Next
End Sub
・ツリー全体表示

【76585】コンパクト化
質問  こずえ  - 15/1/22(木) 15:01 -

引用なし
パスワード
   いつもお世話になっております。
Sheet(エネ)の範囲に値が入った場合、Sheet(メニュー)のC10〜J10に「印刷」と言う文字が入ります。
モジュールは、Sheet(エネ)のSheetモジュールに書いてます。
コンパクトにできますか?
宜しくお願いします


Private Sub Worksheet_Change(ByVal Target As Range)
  Worksheets("メニュー").Range("C10").Value = IIf(Range("C13").Value = "" And Range("C14").Value = "", "", "印 刷")
  Worksheets("メニュー").Range("E10").Value = IIf(Range("C64").Value = "" And Range("C65").Value = "", "", "印 刷")
  Worksheets("メニュー").Range("G10").Value = IIf(Range("C115").Value = "" And Range("C116").Value = "", "", "印 刷")
  Worksheets("メニュー").Range("I10").Value = IIf(Range("C166").Value = "" And Range("C167").Value = "", "", "印 刷")
  
  Worksheets("メニュー").Range("D10").Value = IIf(Range("C219").Value = "" And Range("C220").Value = "", "", "印 刷")
  Worksheets("メニュー").Range("F10").Value = IIf(Range("C248").Value = "" And Range("C249").Value = "", "", "印 刷")
  Worksheets("メニュー").Range("H10").Value = IIf(Range("C277").Value = "" And Range("C278").Value = "", "", "印 刷")
  Worksheets("メニュー").Range("J10").Value = IIf(Range("C306").Value = "" And Range("C307").Value = "", "", "印 刷")
End Sub
・ツリー全体表示

【76584】Re:Sheet1のデータを1行ごとに印刷する方...
お礼  oak  - 15/1/20(火) 13:35 -

引用なし
パスワード
   ▼独覚 様
差し込み印刷で無事データを印刷できました。
マクロにばかり気が行って、差し込み印刷に気付かなかったのはお恥ずかしい限りです。
ご助言ありがとうございました。
・ツリー全体表示

【76583】Re:宜しくお願いします。
お礼  こずえ  - 15/1/20(火) 13:11 -

引用なし
パスワード
   βさん
お返事有難うございます。
>Range("C3,C4")
ごめんなさい!!
お恥ずかしい質問をしてしまいました。
・ツリー全体表示

【76582】Re:宜しくお願いします。
発言  β  - 15/1/20(火) 12:54 -

引用なし
パスワード
   ▼こずえ さん:

こんにちは

Range("B7,C4")

なぜ、B7が登場するんですか?

Range("C3,C4")

でしょ?
・ツリー全体表示

【76581】宜しくお願いします。
質問  こずえ  - 15/1/20(火) 11:01 -

引用なし
パスワード
   Sheet(メニュー) フォームボタン設置
【C3:F3】と【C4:F4】がセルの配合。
としております。

【C3:F3】と【C4:F4】が、
空白または、どちらかが入力されていない時MsgBox "【住所または社名が末入力されてません。】"
どちらも入力されてる時MsgBox "【住所と社名が差出票にセットされました。】"

*【C3:F3】と【C4:F4】に入力していても【住所または社名が末入力されてません。】と出ます。
 もう1度ボタンを押したら【住所と社名が差出票にセットされました。】と出ます。
宜しくお願いします。

Sub AdCo()
 Dim i As Long
 Dim v As Variant
  
  If WorksheetFunction.CountA(Range("B7,C4")) < 2 Then
   MsgBox "【住所または社名が末入力されてません。】"
 Else
   MsgBox "【住所と社名が差出票にセットされました。】"
  
End If
       ;
       ;
       ;
・ツリー全体表示

【76580】Re:Sheet1のデータを1行ごとに印刷する方...
発言  oak  - 15/1/19(月) 17:31 -

引用なし
パスワード
   ▼独覚 様
>ワードを使って差し込み印刷を行ったらどうかな?

なるほど、マクロにばかりに頭が行って差し込み印刷を考え付きませんでした。
早速やってみます。ありがとうございます。

もし無理なようでしたらまた質問させていただきます。
・ツリー全体表示

【76579】Re:Sheet1のデータを1行ごとに印刷する方...
発言  独覚  - 15/1/19(月) 16:10 -

引用なし
パスワード
   ▼oak さん:
ワードを使って差し込み印刷を行ったらどうかな?
・ツリー全体表示

【76578】Sheet1のデータを1行ごとに印刷する方法
質問  oak  - 15/1/19(月) 15:52 -

引用なし
パスワード
   お世話になっております。
大変初心者の質問で恐縮なのですが、Sheet1に作った表を1行ずつ印刷していきたいと考えています。

Excel2010使用で、Sheet1のA列に品番、B列に品名、C列に色名を入力してあるデータで、行は500行ほどあります。
この表を各行ごとに倉庫の看板として印刷することになったため、一気に印刷できる方法がないかと思い、マクロを作ってみましたがうまく動きません。
コードをご教示いただけないでしょうか?

表はSheet1に以下のように作ってあります

Sheet1
   A    B   C
1 品番  品名  色名
2 3501  リュック  クロ
3 3502  ナップ  ピンク
4 3503  リュック  アカ

このようなデータが500行あります。
この表を、例えば以下のような看板として1枚ずつ印刷したいです。

  A
1 3501
2 リュック
3 クロ

これを500行分連続して行うコードはどのようにしたらよいでしょうか?
恐れ入りますが、どなたかご教示いただければ幸いです。
よろしくお願いいたします。
・ツリー全体表示

【76577】VBAでタブレットカメラの操作
質問  nossa  - 15/1/17(土) 22:33 -

引用なし
パスワード
   windows8.1タブレットのExcelから
以下のようなことは可能でしょうか?

 ●Excelに「カメラボタン」を置く
 ●「カメラボタン」を押すと、タブレットのカメラが起動する
 ●カメラで写真をとると、Excelの所定のセルに写真が表示される。


Windowsタブレットのデバイス(カメラ,GPS,…)の操作を
VBAから行えるのでしょうか?
iOSやAndroidで開発を行ってきましたが、
Windowsタブレットの知識・経験がありません。
ご教示のほどよろしくお願いいたします。
・ツリー全体表示

【76576】Re:平均また回帰分析の範囲の指定方法に...
発言  γ  - 15/1/10(土) 11:01 -

引用なし
パスワード
   横から失礼。

事前に範囲を作成しておくかどうかは本質ではありません。
(そのほうがきれいであることはもちろんですが)

Endの使いかたは分かっていても、Range(セル、セル)という
書き方が自分のものになっていなかったからじゃないですか?

セルの指定方法はExcelVBAのポイントですから、例えば下記のような
記事を参考に、じっくりマスターされることをお勧めします。

セル範囲の指定方法
ht tp://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
・ツリー全体表示

【76575】Re:平均また回帰分析の範囲の指定方法に...
お礼    - 15/1/10(土) 1:27 -

引用なし
パスワード
   なるほど事前に範囲を指定してやればいいのですね、思いつきませんでした。
大変勉強になります、ウッシさんありがとうございました!
・ツリー全体表示

【76574】Re:コマンドボタン
発言  ichinose  - 15/1/9(金) 6:42 -

引用なし
パスワード
   >フォームボタンは、標準モジュールで設定する事が出来ますが
>コマンドボタンは、Sheetモジュールでしか設定できないのですか?

フォームのボタンとActiveXControlのコマンドボタンとは 
ボタン(コマンドボタン)とプロシジャーとの関連付けのしくみが違います。

フォームのボタンは、対象いシートに貼り付けた時点では、実行するプログラムが何なのかは、決まっていません。
ボタン作成後に、クリック時にどのプログラムを実行するかを定義します。
所謂、ボタンと実行するプログラムを関連付け、リンクですね!!
リンクするプログラムは、標準モジュール、シートモジュール
ThisWorkBookのモジュールにあるプロシジャーで OKです。


対して、


ActiveXControlのコマンドボタンは、これにユーザーが施した操作(イベント)によって
記述するプロシジャー(プロシジャー名や呼び出し形式等)が決まっています。
これは、コマンドボタンが最初から用意しています。
例えば、

Commanbutton1をクリックした時のプロシジャー名は

Private Sub CommandButton1_Click()

と   コマンドボタン名(又は、変数名)_Click というプロシジャー名前になります。
ユーザーが施した操作(イベント)は、そのオブジェクトによって、規定されます。
コマンドボタンには、他にもコマンドボタン上をマウスが通過した時に発生する
Moveというイベントがあります。そのイベントをきっかけに動作するプログラムは

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

End Sub
このような手続きで規定されるプロシジャー内に記述します。

これらは、オブジェクトによって違いますが、いずれにせよ そのオブジェクトが
用意しているものなのです。

これらのオブジェクトが用意しているイベントプロシジャーは、
オブジェクトモジュールと呼ばれるモジュールにしか記述はできません。

コマンドボタンを貼り付けたシートのモジュールだと簡単に

Private Sub CommandButton1_Click()
  msgbox "ok"
end sub


という記述でクリック時のプログラムが実行できますが、
ちょっとしたコードを記述することによって、コマンドボタンを貼り付けた対象シートではない別のシートのモジュールやThisWorkBookのモジュール、ユーザーフォームのモジュール、クラスモジュール等のオブジェクトモジュールには、記述することができます。

しかし、標準モジュールには、直接記述することはできません。

これが

>コマンドボタンは、Sheetモジュールでしか設定できないのですか?

に対する私の意見です。


>標準モジュールとシートモジュールは、どう違うのですか?

記述したように イベントプロシジャーが記述できないのが標準モジュールで
記述できるのがシートモジュール(オブジェクトモジュール)、
これも違いの一つですよね!!


私は、標準モジュールはなるべく使わない方向でプログラムを作成していますが、


標準モジュールには、
そのブック全体で使うような汎用的な機能を有するプロシジャーを記述します。


シートモジュールには、その対象シートに深く関わりのある処理をするプロシジャーを
記述するようにしています。


ですから、対象シートに配置したコマンドボタンをクリックしたときのプロシジャー


CommandButton1_Click

は、きっと対象シートに深く関わりのある内容なのだと解釈されて、
シートモジュールに記述できるようになっているのではないですか?


どのモジュールに記述するかの判断は、難しいです、私もVBAを始めて10年を超えますが、未だに迷うときが沢山あります。これは、経験が必要だと思います。


以下の記述をその判断のひとつの参考例として、読んだり、操作してみてください。


新規ブック(Sheet1というシート名がある)にて、


Sheet1のモジュールに


Option Explicit
Sub disp_a1()
  MsgBox Range("a1").Value
End Sub


標準モジュールに以下のコードでですが、以下はコピーせずにご自分で
キーボードで打ち込んでみてください。


Sub test()
  Dim sht1 As Sheet1
  Set sht1 = Worksheets("sheet1")
  sht1.Range("a1").Value = "ichinose"
  sht1.disp_a1
  Set sht1 = Nothing
End Sub


sht1. と打ち込んだ時点で Sheet1のプロパティやメソッドの一覧が表示されますが、

その中に disp_a1 も含まれていることを確認してください。


シートモジュールにプロシジャーを記述するという事は、既成のSheet1というオブジェクトに新たに独自のメソッドを追加することなのです。

こんな事実を踏まえて プログラムをどのように記述するかを悩んでみてください。
・ツリー全体表示

【76573】Re:コマンドボタン
お礼  こずえ  - 15/1/8(木) 13:27 -

引用なし
パスワード
   独覚さん

有難うございました。
・ツリー全体表示

【76572】Re:コマンドボタン
発言  独覚  - 15/1/8(木) 11:45 -

引用なし
パスワード
   ▼こずえ さん:

>独覚さんが仰ってる事は、なるべくシートモジュールに書いた方が良いと言う事ですね?
言葉足らずだったかな。

コマンドボタンでも処理本体は標準モジュールに作成することができる、という話です。
・ツリー全体表示

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