新生活!引っ越してから困らないように注意すべきことは?>>

Excel自体のウィンドウサイズ変更を、イベントで取得したいです。

状況としては、
・Excel2010を使用
・ファイルオープン時、ウィンドウを分割して横に並べるようにvbaコーディング済み
・分割されている個々のウィンドウサイズ変更はwindowresizeイベントで取得できるが、Excelアプリケーション自体のサイズ変更を取得できていない(Excel最大化時など)

希望は、
「Excelアプリケーション自体のウィンドウサイズが変わった場合、これをイベントで検知して、分割表示している二つのウィンドウサイズを調整する」
です。

宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

教科書的に簡単に書くと以下の通りですが、今ひとつ、抜けがあるような気がしてなりません。

Class で行ったほうが強固です。

以下は、Workbook イベント側を、もうひとつ加えたほうが良いかもしれません。何度か試してみてください。

'//ThisWorkbook モジュール

Private WithEvents xlApp As Excel.Application
Private Sub Workbook_Open()
Set xlApp = ThisWorkbook.Application
End Sub


Private Sub xlApp_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
Dim Stts As String
  If Wb Is ThisWorkbook Then
  Select Case Wn.WindowState
   Case xlNormal: Stts = "Nomal"
   Case xlMinimized: Stts = "Minimized"
   Case xlMaximized: Stts = "Maximize"
  End Select
   MsgBox Stts, vbInformation
  End If
End Sub
    • good
    • 3

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qexcelで、空白を除いてデータを抽出する方法について

教えてください。
添付のように、列Aに入力されている文字列だけ抽出したいです。
作業列をもうけずに、セルD2に入力する関数を教えてください。

よろしくお願いします。

Aベストアンサー

こんにちは!

画像の配置だとD2セルに
=IFERROR(INDEX(A$3:A$1000,SMALL(IF(A$3:A$1000<>"",ROW(A$3:A$1000)-2),ROW(A1))),"")

配列数式ですので、Ctrl+Shift+Enterで確定!
D2セルのフィルハンドルで下へコピーしてみてください。m(_ _)m

QVBA初心者です。ファイルの検索、貼り付け方を教えてください。

はじめまして。
中小企業の工場で働いている者です。

伝票作成の効率化のため
選択したセルの部品のファイルを特定のフォルダから検索し、注文番号を張り付ける、
というマクロを作成したいと思うのですが、
VBA初心者の私にはプログラムを作れそうにありません。

誰かお力添え頂けませんでしょうか。


具体的には、まず、下のような、注文一覧表Ⅰがあり、
B列に顧客NO.、C列に注文番号、F列に部品番号を入力しています。

------A ---------- B---------------C------------D -------------E ----------- F
1---------------顧客NO.--------注文番号----------------------------------部品番号
2----------------aaa ------------注文あ-------------------------------------部品い
3----------------bbb-------------注文う------------------------------------部品え
4----------------ccc-------------注文お-------------------------------------部品か



F2の『部品い』のセルをクリックし、マクロのボタンを押すと
デスクトップ上の「伝票一覧Ⅱ」のショートカットファイル(伝票一覧Ⅱは会社のサーバー内のファイル)から『部品い』を含むエクセルファイルを検索し開く。

『部品い』のエクセルファイルは、Sheet1からSheet3まであり
(伝票一覧Ⅱのエクセルファイルは、必ず、Sheet1からSheet3まであります。)、
まず、Sheet3のL1のセルに
注文一覧表Ⅰの『部品い』と同じ行のC列の『注文あ』を張り付ける。

Sheet3
---A-B-C-D-E-F-G-H-I-J-K-------L
1---------------------------------注文あ

次に、Sheet2の「注文番号」と書いてあるセルの同列の1つ下の行のセルに
注文一覧表Ⅰの『部品い』と同じ行のC列の『注文あ』を張り付ける。
(若干、部品によって、様式(注文番号と書いている行列)が違います。)

Sheet2(例えば)
---A-B-C-D-E-F-G-H-I-J-------K
1------------------------------注文番号
2------------------------------注文あ

続いて、
Sheet1の「注文番号」と書いてあるセルの同行の1つ右の列のセルに
注文一覧表Ⅰの『部品い』と同じ行のC列の『注文あ』を張り付ける。
また、
「管理番号」と書いてあるセルの同行の2つ右のセルに、
注文一覧表Ⅰの『部品い』と同じ行のC列の『注文あ』を張り付ける。
また、
『顧客NO.』と書いてあるセルの同行の1つ右の列のセルに、
注文一覧表Ⅰの『部品い』と同じ行のB列の『aaa』を張り付ける。
 
Sheet1(例えば)
-----A--------------B--------C-------D-E-F-G-H-I-------------J------------K  
1--------------------------------------------------------------注文番号-----注文あ
2--管理番号----------------注文あ
3
4--顧客NO.-------aaa
            

次に、デスクトップ上の「伝票一覧Ⅲ」のショートカットファイル(伝票一覧Ⅲも会社のサーバー内のファイル)から『部品い』を含むファイル(DocuWorks文書 (.xdw))を検索。検索結果の表示。

以上になります。

その後、注文一覧表Ⅰの『部品え』、『部品か』と伝票を出していきますが、
間違えないように、1部品毎、プリントアウトしていく予定でおります。

よろしくお願い致します。

はじめまして。
中小企業の工場で働いている者です。

伝票作成の効率化のため
選択したセルの部品のファイルを特定のフォルダから検索し、注文番号を張り付ける、
というマクロを作成したいと思うのですが、
VBA初心者の私にはプログラムを作れそうにありません。

誰かお力添え頂けませんでしょうか。


具体的には、まず、下のような、注文一覧表Ⅰがあり、
B列に顧客NO.、C列に注文番号、F列に部品番号を入力しています。

------A ---------- B---------------C------------D -------------E --...続きを読む

Aベストアンサー

>VBA初心者の私にはプログラムを作れそうにありません。

無理です。
というのは初心者は構わないんですが、
富士山に最初から登りたいというような話で
まずは近所の丘に着実に登ることから始めなければなりません。

質問は多岐にわたって判らないことだらけですよね。
このような状態で教えてもらっても理解できることはありません。
表題が「ファイルの検索、貼り付け方を教えてください。」
であるにも関わらず、内容は複雑。

質問はひとつづつ、尚且つ8割り型判っているけど
あと少しが乗り越えられないということを
一点ずつ尋ねて解決するのが上達への早道です。

そこでまずは「ファイルを特定のフォルダから検索し」
この一点だけを見てみましょう。
これはDir()で実現出来ます。
まず excel vba dir でググりましょう。
使い方が沢山出てきますから、自分の環境で試すんです。
それだけだって最初は簡単には行かない事が多いもので
その時にわからない点を尋ねるんです。

何時間もかかる話を丸投げしてはいけません。
天は自ら助くる者を助くです。

Qエクセルvbaでの日付検索

VBA初心者です。どなたかご教示願います。

以下の表があり、
①A2の2010/1/10と3行目を左から比較してA2より日付が新しい列のC1を取得。
②①の次行であるD2の2011/4/1と3行目を左から比較してD2より日付が新しい列のE1を取得。
③繰り返し

A列 B列 C列 D列 E列
10 100 1000 10000 100000
2010/1/10 2010/2/10 2010/3/1 2011/4/1 2011/5/1
2009/1/1 (ブランク) 2011/2/1 2011/3/1 2011/6/1

説明が下手ですみません。お力添えください。

Aベストアンサー

こんにちは

よくわからないところがありますが、そのあたりは適当ですので、処理方法の参考にでもなれば。

以下の仮定をしています。
※ 2行目と3行目は全てDate型の値(またはブランク)の値となっている
 (数値や文字列があるとエラーになる場合があります。回避は可能ですが行っていません。)
※ 繰り返しの終了の判断は、
  ・3行目を探しても該当日付が無い場合
  ・2行目で次の列の日付を参照した際に値が無い場合
  としています
※ 「1行目の値を取得」と書いてあるのみで、その値をどうするのかが不明です。
  複数になる可能性があるので、ひとまずカンマ区切りの文字列にしています。

3行目の日付の順が昇順っぽいですが、不明なのでプリミティブに毎回左から順に比較しています。
2行目と3行目の日付の関連や、昇順などの条件を利用できれば、要領よく比較をしたり、LookUp関数などを利用することができるのかもしれません。

Sub test()
Dim colMax As Long, col As Long, c As Long
Dim str As String, flg As Boolean, d

colMax = Cells(3, Columns.count).End(xlToLeft).Column
col = 1
str = ""

Do
 flg = False
 d = Cells(2, col).Value
 For c = 1 To colMax
  If d < Cells(3, c).Value Then
   str = str & "," & Cells(1, c).Value
   If Cells(2, c + 1) <> "" Then
    flg = True
    col = c + 1
   End If
   Exit For
  End If
 Next c
Loop While flg = True

Debug.Print Mid(str, 2)
End Sub

こんにちは

よくわからないところがありますが、そのあたりは適当ですので、処理方法の参考にでもなれば。

以下の仮定をしています。
※ 2行目と3行目は全てDate型の値(またはブランク)の値となっている
 (数値や文字列があるとエラーになる場合があります。回避は可能ですが行っていません。)
※ 繰り返しの終了の判断は、
  ・3行目を探しても該当日付が無い場合
  ・2行目で次の列の日付を参照した際に値が無い場合
  としています
※ 「1行目の値を取得」と書いてあるのみで、その値をどうするのかが...続きを読む

QExcel 行の非表示について

シート1のA列のみ非表示にし、A列を表示させない方法はありますでしょうか?
シートの保護だけだと、スクロール?手動でA列を開けてしまいます。完全に非表示にする方法があればどうか教えていただけると有難いです。
よろしくお願い致します。

Aベストアンサー

No.5 の追記

先ほどの見る方法②

全セルを選択して、別シートに貼り付ける。貼付先ではシート保護がかかっていない状態になり列幅を変更出来てしまう。
これも書式設定の保護タブの「ロック」にチェックを入れ、シート保護を掛けるときに、このシートのすべてのユーザーに許可する操作で「ロックされたセル範囲の選択」のチェックを外す事で全セルを選択出来なくなります。→ チャント設定すれば問題ない。

Q再計算の負担度低い関数式

お世話になります。

例題から説明しますと、

J列に「数値、文字列」を入力し、
それがE列からG列の間にある数値、文字列に含まれているかどうかを検索するには、
COUNTIF関数を用いています。

=COUNTIF($E:$G,$J2)

しかし、再計算する上で負担の大きいCOUNTIF関数を用いず、他の関数を用いるとすれば
どんな関数(式)が考えらるでしょうか?

Aベストアンサー

返事ありがとうございます。

#6の補足:
msdnのリンク先
>私のような入門レベルの者にとって、とても難しく、理解するには一苦労ですが、

私もです。合計で5回ぐらい読んで、答えなくてはならなくて、やっと意味が通るようになりました。非常に、わかりにくいです。揮発性とか不揮発性という言葉すら、変な言葉ですからね。不揮発というのは、セルの関数の中に検索データが残るタイプの検索値です。それであれば、負担は大きくないし、COUNTIFも、こちらのタイプです。

別のカテゴリのリンク先の話も同様ですが、かなり難しい内容だと思います。

QExcelで2つ1組の数値の内、1つの数値を別の数値とセットにする方法

①のシートのA列に型番、B列にシリアルが入っており、②のシートのA列に型番のみが入っています。
①と②の型番は完全一致しているものもあれば、型番の末尾が途切れてしまい完全一致しないものもありますし、数文字しか一致しないものもあります。
②の型番の隣に①のシリアルを入れたいのですが、何かうまく関数を使えば簡単にできるでしょうか?

型番をそれぞれ昇順にして貼り付けようとしたのですが、①と②の型番が完全一致ではないため、同じ並びにならず、そのまま貼り付けることができません。
何かいい方法があれば教えて下さい。
宜しくお願い致します。

例】
①シート
A列 B列
ABC 1234
PQR 2345
STU 5678
XYZ 1209
②シート
A列 B列
TU
XYS
PQR
BC

分かりづらかったらすみません。。。
宜しくお願い致します。

Aベストアンサー

部分的に重複しているような型番もあるのでしょうか?
ABCとABDという型番があり、②に欠けたABという型番があった場合、ABCかABDか判断する方法が無いと思います。
また、②のXYSというのはXYZが間違えて?入力されているような場合を想定していると思われますが、それもどの程度の一致で判断するのでしょう?
②にXYSとあって、①にXYZとEYSが存在した場合、どちらと判定すればよいか分からないと思います。

何らかの判断基準を決めたとして、
まずVLOOKUPで完全一致を探し、一致したもののシリアルを取得します。
フィルタを使い、エラー表示のものだけ表示し、式の内容を変更します。

判断基準の優先度が高いものから順に試します。
場合によっては①のA列とB列の間に列を挿入し、判定用の補助セルとして使います。
例えば、前から5文字一致したら同一とみなす。とした場合、
VLOOKUPとLEFTにより、左から5文字抽出したものが一致した場合にシリアルを取得します。
先ほど同様にフィルタでエラーのものだけ表示させ、また別の条件の式を入力します。

例えば今度は右から5文字一致したら、とかでしょうか。
あるいは②の文字が欠けているとして、②の全てを含むセル。という条件もあるでしょう。
この場合SUMPRODUCTやFIND、INDIRECT、ROW等を使い、一致するものがある列の行番号を取得する必要があると思われます。

データの数にもよりますが、残り少なくなれば判定式を考えるより目で見た方が早いかもしれません。

自分が思いついたのはこの程度です。
人間が条件を指定してあげないと機械も判別できないですよ。
もっと上手いやり方もあるかもしれないので、他の回答者に期待。

部分的に重複しているような型番もあるのでしょうか?
ABCとABDという型番があり、②に欠けたABという型番があった場合、ABCかABDか判断する方法が無いと思います。
また、②のXYSというのはXYZが間違えて?入力されているような場合を想定していると思われますが、それもどの程度の一致で判断するのでしょう?
②にXYSとあって、①にXYZとEYSが存在した場合、どちらと判定すればよいか分からないと思います。

何らかの判断基準を決めたとして、
まずVLOOKUPで完全一致を探し、一致したもののシリアルを取得します。
...続きを読む

QVBAで、以下を行いたいです。 あるドライブのフォルダに、csvファイルが複数あります。全てのcsv

VBAで、以下を行いたいです。

あるドライブのフォルダに、csvファイルが複数あります。全てのcsvのファイル名は、以下の形式です。

日本語5文字+数字5桁+日本語5文字+数字5桁
例として、あいうえお12345かきくけこ67890、のような感じです。

例で挙げた名前のファイルであれば、Excelファイルの最終行のA列に12345、B列に67890、C列にcsvファイルのB3セルの左から5文字めまでを、D列以降には、csvファイルのC1〜C20までをコピーします。

これをフォルダにあるcsvファイルの数だけ、行います。

教えて頂けます様に、よろしくお願いします。

Aベストアンサー

こんばんは。

最終行のA列に12345| B列に67890 |C列にcsvファイル
「B3セルの左から5文字めまで」
「D列以降には、csvファイルのC1〜C20まで」
をコピーします。

となっていますが、csvファイルのC1~C20 を、右横方向に埋めていくことだと推理してみました。

それと、文章的に不足している部分は、こちらの想像で補完しますが、試しにつくってみました。CSVをExcelで開けずに取り出すことを考えて作りました。

このような内容の前提で作りました。

file名:あいうえお12345かきくけこ67890.csv

A列    B列
12345 67890、

C列
B3セルの左から5文字めまで, 例:abcdefg
abcde

D列
C1〜C20 を、D列からW列までコピー

なお、一部、正規表現でファイル名を取得する所*は、多少、失敗を誘発する可能性があるところです。 必ず、その条件に当てはまらないと、データは取得できません。


'// 標準モジュールのみ対象。
Sub GetDataFromCSV()
 '*******ユーザー設定 *******
 Const mPATH As String = "C:\Users\Test1\" '末尾は必ず、¥を入れてく多剤。
 If Right(mPATH, 1) <> "\" Then MsgBox "パス名に'\' がありません。", vbCritical: Exit Sub
 
 Dim RegEx As Object
 Dim FName As String
 Dim Ary As Variant, a As String, b As String
 Dim buf As Variant, buf2 As Variant
 Dim Lr As Long, i As Long, j As Long, k As Long, m As Long
 ReDim Ary(0)
 Ary(0) = ""
 FName = Dir(mPATH & "*.csv", vbNormal)
 Do While FName <> ""
  If FName <> "." And FName <> ".." Then
   ReDim Preserve Ary(i) '動的変数にする
   Ary(i) = mPATH & FName
   i = i + 1
  End If
  FName = Dir
 Loop
 
 If UBound(Ary) < 1 Then MsgBox "ファイル名を取得出来ませんでした。", vbExclamation: Exit Sub
 
 Lr = Cells(Rows.Count, 1).End(xlUp).Row '最後の行を探す
 If Lr = 1 And Cells(1, 1).Value = "" Then Lr = 0
 
 Dim objFS As Object
 Set objFS = CreateObject("Scripting.FilesystemObject")
 
 Dim Ms
 Set RegEx = CreateObject("VBScript.RegExp")
 With RegEx
  .Global = True: .IgnoreCase = False: .MultiLine = True
 End With
 RegEx.Pattern = "([0-9]{5})"
 Dim objText As Object
 For j = 1 To UBound(Ary)
  FName = Dir(Ary(j))
  Set Ms = RegEx.Execute(FName)
  If Ms.Count = 0 Then MsgBox "ファイル名取得に失敗しました。", vbExclamation: Exit Sub
  a = Ms(0).SubMatches(0) '*
  b = Ms(1).SubMatches(0) '*
  Cells(j + Lr, 1).Value = a: Cells(j + Lr, 2).Value = b
  Set objText = objFS.OpenTextFile(Ary(j), 1, 0)
  Do While objText.AtEndOfLine <> True
   buf = objText.Readline
   buf2 = Split(buf, ",")
   m = m + 1
   If m = 3 Then Cells(j + Lr, 3).Value = Left$(buf2(1), 5)
   Cells(j + Lr, m + 3).Value = buf2(2) 'C列
   If m > 19 Then Exit Do '20過ぎたら離脱
  Loop
  objText.Close
  m = 0
 Next j
 Set RegEx = Nothing
 Set objFS = Nothing
End Sub

こんばんは。

最終行のA列に12345| B列に67890 |C列にcsvファイル
「B3セルの左から5文字めまで」
「D列以降には、csvファイルのC1〜C20まで」
をコピーします。

となっていますが、csvファイルのC1~C20 を、右横方向に埋めていくことだと推理してみました。

それと、文章的に不足している部分は、こちらの想像で補完しますが、試しにつくってみました。CSVをExcelで開けずに取り出すことを考えて作りました。

このような内容の前提で作りました。

file名:あいうえお12345かきくけこ67890.csv

A列    B...続きを読む

Q現在時刻を刻々と表示

NOW()ですと その時点の日時が表示されますが、時・分・秒を刻々と表示するにはどうしたらよいでしょうか。

Aベストアンサー

例えば、Sheet1のA1セルにNOW()関数で時分秒が表示されているものとします。
その上で、次のマクロを標準モジュールに作成して実行すれば、お望みの表示が可能です。

なお、セルが入力モード(セルをダブルクリックして、セル内に縦棒のカーソルが表示されている状態)の時などは、マクロの実行が一時的に停止してしまいますので、その間は時分秒の表示は更新されません。

Sub myTimer()
Sheets("Sheet1").Range("A1").Calculate
Application.OnTime Now + TimeValue("00:00:01"), "myTimer"
End Sub

QRange("K" & TR).Formula = で、セルにマクロで式を書きたいのですが

よろしくお願いします。いつもgooの皆さんには大変お世話になっています
エクセルは2013です

わけあって、セルにマクロで式を書いています
例えば TRは行を表す変数ですが
Range("K" & TR).Formula = "=IFERROR(AY" & TR & ","""")" と書いたマクロの結果は
=IFERROR(AY43,"") という式がRange("K" & TR) に書かれます

それでは、いま、マクロで下記のように書いているコード(TRは行を表す変数です)
Range("Z" & i) = Range("Z" & i - 1) - Range("AG" & TR) * 10000 は
Range("Z" & i).Formula = 
で書く場合、=の右側をどう書いたら良いでしょうか

色々とやってみたのですが狙った式になりません

この場合 変数 i を使っているので、もしかしたら、そもそも無理なことでしょうか

うまく説明できていませんがよろしくお願いします

Aベストアンサー

No.1です。申し訳ありません大ボケな回答をしていましました。

要するに↓ってことですよね? また勘違いしていたらスミマセン。

Range("Z" & i).Formula = "=Z" & i - 1 & "-AG" & TR & " * 10000"

QExcel 日にち毎の集計方法

集計の仕方を教えて下さい。
Excel 縦A列に全従業員名
横列に1~31日の日にちがあり、
それぞれ出勤日に⚫が付いています。
⚫が付いた日にち毎に出勤者をいっきに確認したいです。
関数もしくはピボットテーブルでの集計の方法を教えて下さい。

Aベストアンサー

フィルタを使ってください。添付の図では●のみをフィルタを使って表示しています。
1日にフィルタを設定し1日の出勤者(氏名1,3,7,10)のみを表示しています。


人気Q&Aランキング