Excel VBA質問箱 IV

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

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


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

【77799】Re:イミディエイトを使用禁止にする方法
お礼  pieta  - 15/12/23(水) 23:27 -

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

回答ありがとうございました。
・ツリー全体表示

【77798】Re:イミディエイトを使用禁止にする方法
発言  γ  - 15/12/23(水) 22:56 -

引用なし
パスワード
   それ言いだしたら、新しいプロシージャで
 Application.EnableEvents = False
を実行することもできるし、
更に言えば、マクロ自体を無効にすることもできます。
そもそもから検討されたほうがよいかもしれません。
・ツリー全体表示

【77797】イミディエイトを使用禁止にする方法
質問  pieta  - 15/12/23(水) 22:47 -

引用なし
パスワード
   BeforePrintイベントでプリントアウトを禁止する設定にしたのですが
イミディエイトウィンドウでApplication.EnableEvents = Falseを実行すると
印刷出来てしまいます。

vbaでイミディエイトを使えないように出来ないものでしょうか?
・ツリー全体表示

【77796】Re:セルの結合→貼付け
お礼  ぼぶ  - 15/12/23(水) 12:40 -

引用なし
パスワード
   γ様

ご回答ありがとうございます。

教えていただいた方法で希望していた通りに動作致しました。

VBAはまだまだ初心者で、1動作ずつ勉強しながら手さぐりで作成しているので、
また変数iの使い方や結合の問題などについてもアドバイス頂き、とても勉強になります!

セル結合については、Sheet2は印刷用のシートとして使う為、
レイアウト的な関係で結合することにしているのですが、
不具合が発生するようでしたら、γ様に教えていただいたコードを参考に、
自分なりに結合しないやり方を考えてみようと思います。

本当にありがとうございました!
・ツリー全体表示

【77795】Re:セルの結合→貼付け
発言  γ  - 15/12/23(水) 6:19 -

引用なし
パスワード
   コードの一例です。

Sub harituke()
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Dim rng As Range
  Dim lastrow As Long
  Dim k As Long
  Dim r As Long
  Dim c As Long
  Dim code As String
  Dim item As String

  Set ws1 = Worksheets("Sheet1")
  Set ws2 = Worksheets("Sheet2")

  r = 1 - 8  '転記先行番号初期値

  lastrow = ws1.Cells(Rows.Count, 1).End(xlUp).Row
  For Each rng In ws1.Range("A2:A" & lastrow)
    code = rng.Offset(0, 1).Value
    item = rng.Offset(0, 2).Value
    If rng.Value = "■" Then
      If k Mod 2 = 0 Then
        r = r + 8
        c = 1
      Else
        c = 5
      End If

      ws2.Cells(r, c).Value = code & item
      ws2.Cells(r, c).Resize(8, 4).Merge

      k = k + 1
    End If
  Next
End Sub

コメント:
(1)変数i は伝統的に、整数、とりわけループ変数に用いられるので、
  その慣習に従ったほうが違和感は少ないです。
  論理的には間違いとは言えないが、普通、こういうiの使い方はしません。
(2)セル結合が本当に必要か、よく検討したほうが良いです。
  セル結合するとあとあとの処理で色々な困難が待ち構えています。
  できれば避けるべきですね。
 
・ツリー全体表示

【77794】セルの結合→貼付け
質問  ぼぶ  - 15/12/23(水) 3:59 -

引用なし
パスワード
   初めて質問させていただきます。

Shee1に下記のような商品の管理表があります。
(実際のデータ行は100件以上あります)

 A     B         C
1選択    商品コード    商品名
2■    AA1111        リンゴ
3■    AA2222        バナナ
4□    AA3333        みかん
5■    AA4444        桃
6□    AA5555        メロン
7■    AA6666        イチゴ

A列が■になっている行の商品コードと商品名を合体(例:AA1111リンゴ)させて、
それをSheet2に貼り付けていくマクロを作りたいと思っています。

Sheet2はセルをA1:D8(1.)、E1:H8(2.)、A9:D16(3.)、E9:H16(4.)という風にそれぞれ結合したうえで、
1.2.3.4.の順番(Zを描くような動き)で貼り付けていきたいです。
(上記の例ですと、1.にAA1111リンゴ、2.にAA2222バナナ、3.にAA4444桃、4.にAA6666イチゴとなります)

また、初期状態ではA1:D8などのセルの結合はされていない真っ白な状態なので、
セルの結合⇒貼付け、セルの結合⇒貼付け…という動作が必要になります。

■になっている行の商品コードと商品名を合体させて取得するところまでは、
いろいろ参考にしながら下記のように書いたのですが、
それをSheet2に、セルを結合しながら、Zを描くような動きで貼り付ける動作が全く分からずとても困っています。
是非お力をお貸しください。よろしくお願いいたします。

-------------------------------------------------------
Sub harituke()
  Dim i As Range
  Dim lastrow As Long
  
  lastrow = Cells(Rows.Count, 1).End(xlUp).Row
  For Each i In Range("A2:A" & lastrow)
    code = i.Offset(0, 1).Value
    item = i.Offset(0, 2).Value
     If i = "■" Then
      ここにセル結合&貼付けの動作???
  End If
  Next i
  
End Sub
・ツリー全体表示

【77793】Re:早速の返信、ありがとうございます。
お礼  勉強中  - 15/12/23(水) 0:44 -

引用なし
パスワード
   >▼β さん:
希望通りの操作が出来ました。重ねて御礼申し上げます。
ありがとうございました。
・ツリー全体表示

【77792】Re:早速の返信、ありがとうございます。
お礼  勉強中  - 15/12/23(水) 0:00 -

引用なし
パスワード
   ▼β さん:
返信が遅くなり申し訳ございませんでした。モードレス表示です。
さっそく、トライしてみます。結果もご報告させていただきます。
VBAは奥が深く難しいですが、これからもコツコツ勉強します。
初心者の私にも分かりやすく教えていただき、感謝申し上げます。
・ツリー全体表示

【77791】Re:早速の返信、ありがとうございます。
発言  β  - 15/12/22(火) 22:44 -

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

ところでユーザーフォームはモードレス表示ですか?モーダル表示ですか?
・ツリー全体表示

【77790】Re:IE操作におけるテーブル行の選択につ...
発言  γ  - 15/12/22(火) 21:21 -

引用なし
パスワード
   回答ではないのですが。

仮に選択できたとして、その後何をしようとされていますか?
その行をどこかにコピーペイストしたいとか、ですか?
選択しなくても、なんらかの方法でそれが特定できるならOKとはなりませんか?
・ツリー全体表示

【77789】Re:早速の返信、ありがとうございます。
発言  β  - 15/12/22(火) 17:38 -

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

WindowState ではなく Application.Visible を使った例です。
UserForm1のCommandButton1をクリックするたびに、エクセルの表示・非表示を
切り替えます。

新規ブックで試してみてください。
UserForm1にはCommandButton1 を配置してください。

ThisWorkbookモジュール

Private Sub Workbook_Open()
  Application.OnTime Now(), "ThisWorkbook.ShowForm"
  Application.Visible = False
End Sub

Sub ShowForm()
  UserForm1.Show
End Sub

ユーザーフォームモジュール

Private Sub CommandButton1_Click()
  Application.Visible = Not Application.Visible
End Sub
・ツリー全体表示

【77788】早速の返信、ありがとうございます。
発言  勉強中  - 15/12/22(火) 16:55 -

引用なし
パスワード
   ご指摘の通り、Workbook_Open()で最小化を指示しています。作業内容は、Excelを最小化してVBAで作成したフォームのみ表示。しかし、そのフォームの中にあるシート(Excelの表)を呼び出す時、タスクバーをクリック(Excelアイコン)しないと表示されません。そこで、特定のシートを開く際に、自動で最大化にさせたいと思います。基本用語も使えず、適切な説明が出来ず申し訳ございません。まだまだ、勉強不足でお恥ずかしいかぎりですが、ご指導のほどよろしくお願いいたします。
・ツリー全体表示

【77787】Re:最小化→最大化
発言  β  - 15/12/22(火) 15:50 -

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

>意味がいまいちわかりません。

>ファイルを開く際、Excelを最小化(Application.WindowState = xlMinimized)
>させています

Workbook_Open あたりで行っているのでしょうか?
いずれにしても、エクセルは【最小化】になっているんですよね?
で、「シート毎の」解除(xlMaximized等?)ですけど、どんな操作を考えているのですか?
何かしようとするとタスクバーをクリックせざるを得ないですよね?
そうすると、エクセルは、最小化させる前の状況、おそらく最大化になるんでしょうね?
その時のシートは、たまたまブックを開いたときに最前面に出ていたシートです。

で、「シート毎に解除」??
どんな操作をしたときにどうしたいのですか?
・ツリー全体表示

【77786】最小化→最大化
質問  勉強中  - 15/12/22(火) 14:30 -

引用なし
パスワード
   ファイルを開く際、Excelを最小化(Application.WindowState = xlMinimized)
させていますが、Sheet毎にこの指示を解除させる方法はありますか?
教えて頂けたら幸いです。よろしくお願いいたします。
・ツリー全体表示

【77784】IE操作におけるテーブル行の選択について
質問  失礼します  - 15/12/22(火) 11:13 -

引用なし
パスワード
   質問失礼いたします。

Web画面上において、

【スクロールテーブルの中から一行選択】

といった処理を行おうとしております。

Javascriptで記述されているページのBodyのinnnerHTMLを調査した結果、以下のような構造をしているようです。

<TABLE>
 <TR>
  <TD>
   <SPAN>AAA</SPAN>
  </TD>
   …
 </TR>
  …
</TABLE>

ここで、「AAA」の文字列を含まれる行をクリックして選択状態としたいのですが、
以下のような手段を試したものの選択状態とはならず、困っております。

1. タグを"SPAN"で検索し要素に対してFor文を回して"AAA"に該当するSPANをClick()

(例)
 Dim objTag As Object
 For Each objTag In objIE.document.all.tags("SPAN")
  If objTag.innerText = "AAA" Then
    objTag.Click
    Exit For
  End If
 Next objTag

 '※getElementsByTagNameも同様にして試行

2. 該当SPANを含むTRオブジェクトに対してClick()

(例)
 Dim flg As Boolean = False
 Dim objRow As Object
 For Each objRow In objTable.getElementsByTagName("TR")
  Dim objSpan As Object
  For Each objSpan In objRow.getElementsByTagName("SPAN")
   If objSpan.innerText = "AAA" Then
    objRow.Click
    flg = True
    Exit For
   End If
  Next objSpan
  If flag Then Exit For
 Next objSpan

Clickイベントでは選択してフォーカスを当てることが出来ない仕様なのか。。。と悩んでおります。

もし、Objectプロパティの値を書き換えれば済むなど別の方法があればご教示頂けませんでしょうか。

拙い質問で申し訳ありませんが、どうぞよろしくお願いいたします。
・ツリー全体表示

【77783】Re:集計の仕方
発言    - 15/12/20(日) 20:12 -

引用なし
パスワード
   γさん、こんにちは。
経由して 事務さん こんにちは。


ここの掲示板に限らず、事務さんに限らず
Q&A掲示板全般、ずっと眺めていて気づいたのですが
質問直後にノータイムで「正解」が出ると
質問されたかたは理解できない傾向があります。

特に、質問にぴったり寄っていないような形の解決方法だと
理解は困難なようです。


>外部からピボットテーブルの値を参照しようとすると、
>GETPIVOTDATA関数が出てきて、

ああ、そうでした。そうでした。GETPIVOTDATA関数。懐かしいな。
数年前に初めてピボットテーブルをちゃんと使ったきに

って、あれ? わたしがはじめてGETPIVOTDATA関数を見たときには
「あラッキー、こんな便利なものがある」でしたが
この関数を そのあとの集計に使えませんか? → 事務さん

ああ、つまり、そのあとの集計用のマクロにデータを渡すのに
使えないでしょうか。


▼γ さん:
>ラッキーセブンをせしめたγです ww
>
>ワークシート上で、
>外部からピボットテーブルの値を参照しようとすると、
>GETPIVOTDATA関数が出てきて、
>しかも絶対参照的になるので、なんじゃこりゃとなるんでしょうね。
>だから、値と書式だけ、別のところにコピーしてから使えばいいんじゃないかな、
>と思い、それを推奨しているんだけど、一向に聞く耳を持たれない。
・ツリー全体表示

【77782】Re:集計の仕方
発言  γ  - 15/12/20(日) 18:25 -

引用なし
パスワード
   ラッキーセブンをせしめたγです ww

ワークシート上で、
外部からピボットテーブルの値を参照しようとすると、
GETPIVOTDATA関数が出てきて、
しかも絶対参照的になるので、なんじゃこりゃとなるんでしょうね。
だから、値と書式だけ、別のところにコピーしてから使えばいいんじゃないかな、
と思い、それを推奨しているんだけど、一向に聞く耳を持たれない。
・ツリー全体表示

【77781】Re:集計の仕方
発言    - 15/12/20(日) 18:17 -

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

> >説明不足でスミマセン。
2度までは偶然、3度からは必然。
という言葉があります。

確認されたり、補足説明を求められたりが3度に達したら
そもそもまともな説明ができていないと考えてください。

とはいえ、過不足なくきっちり説明できるようなら
質問を立てるような羽目にはならないので。。。。
ある程度は仕方ない部分はありますね。


▼事務 さん:
>▼佳 さん:
>>こんにちは。
>>
>>一切例外なしに必ず 1件2行なら、普通に数式でいけますが?
>>
>>
>>> ピボットテーブルで集計が終わりではなく、(集計後)を利用してさらにデータ加工します。
>>ピボットテーブルが駄目な理由として 成立していませんねぇ。
>>やってみて、うまく行かなかったのですか?
>>だから、「ピボットテーブルとは集計を終わらせるものだ」
>>「ピボットテーブルを利用して加工は絶対できない」と?
>>「でも回答者にはできるかもしれない」とはお考えになりませんか?
>>
>>
>>▼事務 さん:
>>>こんばんは。EXCEL VBA初心者です。
>>>※データは3000行ぐらいあります。
>>>(元データ)を(集計後)のようにしたいのです。その後(集計後を)さらに加工を予定しています。
>>>ピボットテーブルのようにVBAをしたいのですがうまくいきません。他にどのような方法があるのかまったく思い浮かびません。
>>>コードのアプローチを教えてください。よろしくお願い致します。
>>>
>>>
>>>(元データ)
>>>日付    氏名    開始時間    終了時間
>>>2月1日    A    8:00        12:00
>>>2月1日    A    12:00        15:00
>>>2月1日    B    9:00        11:00
>>>2月1日    B    11:00        16:00
>>>2月2日    A    7:00        9:00
>>>2月2日    A    9:00        14:00
>>>2月2日    B    10:00        16:00
>>>2月2日    B    16:00        17:00
>>>
>>>(集計後)
>>>日付    氏名    開始時間    終了時間
>>>2月1日    A    8:00        15:00
>>>2月1日    B    9:00        16:00
>>>2月2日    A    7:00        14:00
>>>2月2日    B    10:00        17:00
>
>
>佳さん
>おはようございます。
>説明不足でスミマセン。
>必ず2行ではありません。
>日付も氏名も複数でバラバラです。
>要はピボットテーブルで作成はできるのですが、ピボットテーブルで作成されたデータをVBAで引用する方法はわかりません。ですのでVBAで集計したデータのほうが次にデータ加工しやすいのではと思っているのです。
・ツリー全体表示

【77780】Re:集計の仕方
発言    - 15/12/20(日) 17:59 -

引用なし
パスワード
   γさんこんにちは。

> おお、記念すべきラッキーセブンだったのですねえ。
ひそかに狙ってたのに〜 笑


▼γ さん:
>おお、記念すべきラッキーセブンだったのですねえ。
>こんなコメントでよかったのかしらん。
・ツリー全体表示

【77779】Re:集計の仕方
発言    - 15/12/20(日) 17:35 -

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

ピボットテーブルに入っているのは単なるあたいです。
だからrange("A1").value とかであたいが取れます。
あ、実際にコードで確認したことはありませんので
できなかったらすみません。

以下はずいぶんまえに2010で 確認済みです(笑
ピボットテーブルの範囲をコピーして、テキトーなセルに貼り付けると
ピボット機能はなくなってタダのセルになります。
range("A1").value とかで値が取れます。


▼事務 さん:
>▼佳 さん:
>>こんにちは。
>>
>>一切例外なしに必ず 1件2行なら、普通に数式でいけますが?
>>
>>
>>> ピボットテーブルで集計が終わりではなく、(集計後)を利用してさらにデータ加工します。
>>ピボットテーブルが駄目な理由として 成立していませんねぇ。
>>やってみて、うまく行かなかったのですか?
>>だから、「ピボットテーブルとは集計を終わらせるものだ」
>>「ピボットテーブルを利用して加工は絶対できない」と?
>>「でも回答者にはできるかもしれない」とはお考えになりませんか?
>>
>>
>>▼事務 さん:
>>>こんばんは。EXCEL VBA初心者です。
>>>※データは3000行ぐらいあります。
>>>(元データ)を(集計後)のようにしたいのです。その後(集計後を)さらに加工を予定しています。
>>>ピボットテーブルのようにVBAをしたいのですがうまくいきません。他にどのような方法があるのかまったく思い浮かびません。
>>>コードのアプローチを教えてください。よろしくお願い致します。
>>>
>>>
>>>(元データ)
>>>日付    氏名    開始時間    終了時間
>>>2月1日    A    8:00        12:00
>>>2月1日    A    12:00        15:00
>>>2月1日    B    9:00        11:00
>>>2月1日    B    11:00        16:00
>>>2月2日    A    7:00        9:00
>>>2月2日    A    9:00        14:00
>>>2月2日    B    10:00        16:00
>>>2月2日    B    16:00        17:00
>>>
>>>(集計後)
>>>日付    氏名    開始時間    終了時間
>>>2月1日    A    8:00        15:00
>>>2月1日    B    9:00        16:00
>>>2月2日    A    7:00        14:00
>>>2月2日    B    10:00        17:00
>
>
>佳さん
>おはようございます。
>説明不足でスミマセン。
>必ず2行ではありません。
>日付も氏名も複数でバラバラです。
>要はピボットテーブルで作成はできるのですが、ピボットテーブルで作成されたデータをVBAで引用する方法はわかりません。ですのでVBAで集計したデータのほうが次にデータ加工しやすいのではと思っているのです。
・ツリー全体表示

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