[PR]ネットとスマホ OCNでまとめておトク!

エクセル2013で次のようなコードについてアドバイスをお願いします。
マクロ上で「新しいウィンドウを開く」が実行されていて、【ブック名:1】のようにどんどんシートが増えていきクローズしたいのだが、いくつウィンドウが開かれているか分からない状態で新ウィンドウだけを(例えば1から5のウィンドウをクローズする)コードを教えてください。ちなみに、教えてもらったコードを次のコード内に入れ込む予定です。よろしくお願いします。


Sub 新ウインドウのクローズ()
Dim strBookName As String
strBookName = ThisWorkbook.Name

On Error Resume Next
Windows.BreakSideBySide '並べて比較を解除
Windows(strBookName & ":1").Close
Range("a3").Select
End Sub

A 回答 (3件)

こんにちは。



>最後に残ったウィンドウの最大化もコード化できれば教えてください。現在は小さいまま残っています。

そうでしたね。残ったウィンドウが、気がついていたのですが、そのままにしてしまいました。

Sub ClosingWindows()
Dim i As Long
With ActiveWorkbook.Windows
For i = .Count To 2 Step -1
 .Item(i).Close
Next
.Item(1).WindowState =xlMaximized '←ここに加える
End With
Range("A3").Select
End Sub
'//

私自身は、ここで最後に残った .Item(1)を任意の大きさにするために、
xlMaximized の代わりに、このようなことを考えました。

With .Item(1)
.Height =780
.Width =1000
.Top =1
.Left =1
End With
Range("A3").Select
End Sub
    • good
    • 0
この回答へのお礼

なるほど。こんな方法もあるんですね。重ね重ねありがとうございました。

お礼日時:2018/09/21 14:26

>いくつウィンドウが開かれているか分からない状態で新ウィンドウだけを(例えば1から5のウィンドウをクローズする)



ということでしたら、このようになります。
最後の1つは残します。

Sub ClosingWindows()
Dim i As Long
With ActiveWorkbook.Windows
For i = .Count To 2 Step -1
 .Item(i).Close
Next
End With
Range("A3").Select
End Sub
    • good
    • 0
この回答へのお礼

思い通りの結果になりました。ありがとうございました。もう一つ、できれば教えていただきたいのですが、最後に残ったウィンドウの最大化もコード化できれば教えてください。現在は小さいまま残っています。お願いします。

お礼日時:2018/09/21 09:09

For Each Wn In ThisWorkbook.Windows


  If Mid(Wn.Caption, 2, 1) = ":" Then
    If Right(Wn.Caption, 1) > "1" Then
      Wn.Close
    End If
  End If
Next Wn
かな。
    • good
    • 0
この回答へのお礼

対応のため、コード作成、ありがとうございました。ただ、ウィンドウは消えていません。

お礼日時:2018/09/21 09:09

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

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

Qエクセル2007でできていたVBAを2013でも動作して欲しい(改作をお願いします)

9月3日に次の質問を出して、bonaronさんからVBAをいただいて解決済みと思っていたら、エクセル2007で動作していたものが2013では動きません。特に2画面が左右ではなく、上下に表示されてしまいます。どなたか分かる方、どの部分にどのような記述を入れたら良いか、教えてください。

9月3日に質問した内容
同じブック内の2つのシートで【比較&同時にスクロール】がうまくできません
エクセル2007を使用して、同じブック内の【暦data合体】というシートと現在見ているシートを整列(左右に並べて表示)して、並べて【比較&同時にスクロール】したいと思っています。
 下のとおり動かすと、最初の画面では予定通り、2画面が正しく表示されています。しかし、そこからスクロールすると、なぜか左側のブック1と右側のブック2が2行分ずれて表示されてしまいます。
 最初の画面が出てから、スクロールする前に表示タブの【同時にスクロール】のチェックを外し、またチェックを入れ直すと、思い通りの動きになりますが、そのようなことをしなくても【比較&同時にスクロール】したいです。どなたか、分かる方、よろしくお願いします。

9月3日の内容に対して、bonaronさんが回答してくださったベストアンサー(ただし、2013には画面が左右ではなく上下になってしまう)

Sub ウインドウの分割による編集()
  Dim strBookName As String
  Dim sh As Worksheet
  
  strBookName = ThisWorkbook.Name
  ActiveWindow.NewWindow
  
  Windows(strBookName & ":1").Activate
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  Sheets("暦data合体").Select
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  
  Windows.CompareSideBySideWith strBookName & ":2"
  Windows(strBookName & ":2").Activate
  Set sh = ActiveSheet
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  Sheets("暦data合体").Select
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  sh.Select
End Sub

9月3日に次の質問を出して、bonaronさんからVBAをいただいて解決済みと思っていたら、エクセル2007で動作していたものが2013では動きません。特に2画面が左右ではなく、上下に表示されてしまいます。どなたか分かる方、どの部分にどのような記述を入れたら良いか、教えてください。

9月3日に質問した内容
同じブック内の2つのシートで【比較&同時にスクロール】がうまくできません
エクセル2007を使用して、同じブック内の【暦data合体】というシートと現在見ているシートを整列(左右に並...続きを読む

Aベストアンサー

こんばんは。

一応、直しました。

>私がやりたいのは右側ウィンドウ1に、
>別なアクティブシート上
>2つのウインドウ(左右の2つの画面)で【比較&同時にスクロール】したいのです。

この部分をメインにして、右がずっと変わっていくものだとします。
この手のマクロは、深く研究したことがないし、誰も手を付けていない分野なので、通常ありきたりのコードしかないはずです。まして、バグっぽい動きがあります。

'------------------------------------------------
'仕様書
'Excel 2013(SDI用)
'・最初のマクロで、同じブック内の同じシートを、画面(Window)を縦にし二分し、左右半半になり、左側の画面の2行目と3行目の間が固定されます。
' しかし、同じシートの場合は、右側の画面の行の固定はなりません。これは、できないようです。また、同じシートの場合は、しないほうがよいでしょう。マクロでは誤動作が発生します。

'・右側のシートを別のシートに、再び同じマクロで実行すると、シンクロと右側の画面の行の固定が可能になります。

・他のブックを開いているとに画面にならないことがありますので、必ず単独のブックで行ってください。他のブックを開いてシンクロさせることは、まだ深く検証されていません。まったく別のプログラムになるらしいです。

'なお、汎用性を求めるために、Sheets("暦data合体").Selectは、加えていません。
必要に応じて、文頭のシングルクォートを外してください。

それから、もしかしてなのですが、このマクロはワークシートのデータを修正するためのものでしょうか。修正だけのためでしたら、ほぼEXCELが中心になる、大変に強力な専用ツール・WinMerge があります。(日経PC21にも紹介されました)

http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html#screenshots

'-----------------------------------------------
'Option Explicit
Private shName As String
Sub LRWinsSyncro()
 Dim arSh(1) As Variant
 Dim wnNames(1) As Variant
 Static ignoflg As Boolean
 Dim i As Long
 Dim ret As VbMsgBoxResult
 Const SPLINE As Integer = 3 '画面割の行位置
 If ActiveWorkbook.Name <> ThisWorkbook.Name Then
  MsgBox "現在のバージョンはアドイン型ではないので、" & vbCrLf & _
   "別のブックでは使えません。", vbExclamation
  Exit Sub
 ElseIf Workbooks.Count > 1 Then
  If ignoflg = False Then
   For i = 1 To Workbooks.Count
    If Workbooks(i).Name Like "xls?" Or Workbooks(i).Name Like "Book*#" Then
     ret = MsgBox("他のブックを開いていると誤動作します。無視して続行しますか?", vbYesNo) '一度だけ聞いてくる
     If ret = vbNo Then
      MsgBox "他のブックを終了してください。", vbInformation
     ElseIf ret = vbYes Then
      ignoflg = True
      Exit Sub
     End If
    End If
   Next
  End If
 End If
 With ActiveWorkbook.Windows
  If .Count = 1 Then
   'Worksheets("暦date合体").Select
   shName = ActiveSheet.Name '暦date合体
   .Item(1).NewWindow
   .Arrange , True, True, True
  End If

  If .Count = 2 Then
   If .Item(1).ActiveSheet.Name = shName Then
    wnNames(0) = .Item(1).Caption
    wnNames(1) = .Item(2).Caption
    arSh(0) = .Item(wnNames(0)).ActiveSheet.Name
    arSh(1) = .Item(wnNames(1)).ActiveSheet.Name
   Else
    wnNames(1) = .Item(1).Caption
    wnNames(0) = .Item(2).Caption
    arSh(0) = .Item(wnNames(1)).ActiveSheet.Name
    arSh(1) = .Item(wnNames(0)).ActiveSheet.Name
    If shName = "" Then shName = arSh(1)
   End If
  End If
 End With
 If arSh(0) = arSh(1) Then
  With Windows(wnNames(0))
   .Activate
   .FreezePanes = False
   .ActiveSheet.Range("A1").Select
   .ActiveSheet.Rows(SPLINE).Select
   .FreezePanes = True
   .ActiveSheet.Range("A1").Select
  End With
  Windows.Arrange , True, True, True
  Windows.CompareSideBySideWith wnNames(0)
 Else
  With Windows(wnNames(1))
   .Activate
   .FreezePanes = False
   .ActiveSheet.Range("A1").Select
   .ActiveSheet.Rows(SPLINE).Select
   .FreezePanes = True
  End With
  With Windows
   .Item(wnNames(0)).Activate
   .CompareSideBySideWith wnNames(1)
   Windows.Arrange ArrangeStyle:=xlVertical
  End With
 End If
End Sub

Sub ReleasedWindows()
'Window(窓) を一つにするマクロ(別のマクロとして残した)
Dim Ac As Worksheet
Dim sh As Worksheet
With ActiveWorkbook.Windows
 If .Count = 2 Then '画面を戻す
  .Item(2).Close
  .Item(1).WindowState =xlNormal
  ActiveWindow.FreezePanes = False
 End If
End With
Set Ac = ActiveSheet
For Each sh In Worksheets
ActiveWindow.FreezePanes = False '画面固定も外す
Next
Ac.Activate
End Sub

'//
以上ですが、これは、ワークシート上のボタンやコマンドボタン類に登録が一見できたように思えても、登録したマクロ名がなくなってしまいます。(マクロ自体は残っています)
そこで、右クリックメニューに入れることを考えました。興味がおありでしたら紹介します。
ただ、このマクロの方向性は、アドイン型に移行するのが良いようです。

こんばんは。

一応、直しました。

>私がやりたいのは右側ウィンドウ1に、
>別なアクティブシート上
>2つのウインドウ(左右の2つの画面)で【比較&同時にスクロール】したいのです。

この部分をメインにして、右がずっと変わっていくものだとします。
この手のマクロは、深く研究したことがないし、誰も手を付けていない分野なので、通常ありきたりのコードしかないはずです。まして、バグっぽい動きがあります。

'------------------------------------------------
'仕様書
'Excel 2013(SDI用)
'・最初...続きを読む

Qエクセルマクロに関してです。

シート指定で別ブックのをコピーしたいのですが・・・うまくいきません
例えばですけど
Book1のSheet2 A4:D28
から
Book4のSheet4 A1:D24 とかの場合でなんですけど。
そんでBooK1に戻る・・・
最後に  ActiveWorkbook で終わってるのが間違いなんですよね??
何で〆ればいいのか分かりません・・・教えてください・・・

Aベストアンサー

拡張子が.xlsだとすると

Workbooks("Book1.xls").Worksheets("Sheet2").Range("A4:D28").Copy _
Destination:=Workbooks("Book4.xls").Worksheets("Sheet4").Range("A1")

とするだけなんだけど・・・・。
Book1とBook4は立ち上げて置く。

QPDFデータをエクセルに変換したいのですが、 マクロを全く理解してないので、ネットで調べてもできませ

PDFデータをエクセルに変換したいのですが、
マクロを全く理解してないので、ネットで調べてもできません。

前の会社で、上司が作ってくれていたアクセスで、
PDFからエクセルに変換して作業をしてたことがあったので、それを思い出して自分で作ろうとしましたが、かなり苦戦してます。



PDFは毎度同じフォーマットです。

今回のPDFデータの場合必要な箇所は、
C/No. KKK00000 1 CTN 1.003 1.600 350 260 160 0.015
O/No. KK02340
C/No. ZZZ00000 1 CTN 1.200 1.700 285 285 150 0.012
O/No. KK00000
の部分。


C/No. KKK00000
1 CTN
1.003
1.600
350
260
160
0.015
O/No. KK02340

C/No. ZZZ00000
1 CTN
1.200
1.700
285
285
150
0.012
O/No. KK00000

と言うようにバラしたいです。

この部分は、商品の詳細を表してるのですが、
日によって行数が増えることも多々あります。
行数が増えた場合でも、対応出来るように、
ボタン一つでエクセルへ変換したいのですが、
どなたかお分りになられる方がいらっしゃいましたら、教えて下さい。

PDFデータをエクセルに変換したいのですが、
マクロを全く理解してないので、ネットで調べてもできません。

前の会社で、上司が作ってくれていたアクセスで、
PDFからエクセルに変換して作業をしてたことがあったので、それを思い出して自分で作ろうとしましたが、かなり苦戦してます。



PDFは毎度同じフォーマットです。

今回のPDFデータの場合必要な箇所は、
C/No. KKK00000 1 CTN 1.003 1.600 350 260 160 0.015
O/No. KK02340
C/No. ZZZ00000 1 CTN 1.200 1.700 285 285 150 0.012
O/No. KK00000
の部分。...続きを読む

Aベストアンサー

PDFは電子的な印刷です
印刷物から内容(数字や文字)を読むことは、一般的には画像認識が必要です
PDFによっては、内容も一緒に印刷された形式もあります

>PDFからエクセルに変換して作業をしてたことがあった
変換できたのは「内容も一緒に印刷された形式」だったと推測されます
今回、質問者さんが手にしているPDFが同じ形式であれば、内容を選択してコピペでエクセルに変換できるでしょう。
不幸にも、「画像として印刷されているPDF」であれば、画像としてエクセルにコピペされるので、エクセルで数値データや文字データとして扱うことはできません。
その場合には、画像認識処理が必要になります。

Q【Excel VBA】マクロの処理速度について

はじめまして。

マクロの処理速度について教えて頂きたいです。

現在、ボタンクリックにて実行される2つのマクロを作成しています。

1つ目のマクロで、ボタンクリックされると表1より転記にて表2を作成し、
最後に2つ目のマクロ(サブルーチン)を呼び出しています。

2つ目のマクロ(サブルーチン)では、作成した表2を参照して
更に別の表3を作成しています。

ボタンクリックでは無く直接、
「マクロ→マクロの表示→実行」で実行すると正しく処理されるのですが、
ボタンをクリックで実行すると、表3の作成が途中で止まっている?ようで正しく作成されません。
(表3は3行分作成されて止まりますが、マクロ終了時に表示される終了メッセージは表示されます)

素人の為、重いマクロを作成してしまっているのかもしれないのですが、
このような事象の解決策をご存知でしたらお願いいたします(>_<)

Aベストアンサー

>シートのクリアにつきまして、クリアしていない認識はあったのですが、クリアをしてしまうと書式設定や表の罫線が消えてしまうため盛り込めていませんでした。
>3行目以降クリアの場合でも罫線と書式設定が消えてしまいますが、(書式設定で、部署別増減一覧のみ0は非表示としていました)マクロでクリア処理を行う場合、全クリアではなくブランクを挿入するイメージの記述等はありますでしょうか?

そういうことでしたら、
Set ws = Worksheets("人員増減一覧")
ws.Range("A1:I5000").Value = ""・・・・①


maxv = sh1.Cells(Rows.Count, "A").End(xlUp).Row
'②部署別増減一覧のクリア
If maxv > 2 Then
sh3.Range("A3:O" & maxv).Value = ""
End If

のようになります。
①は人員増減一覧の罫線を消さないクリアですが、最大行が5000行の場合のように、予め行数がわかってる場合です。
②は部署別増減一覧の罫線を消さないクリアですが、実際にデータがある行までをクリアする方法です。

いずれにしろ、このような方法をとると、添付図の赤線で囲んだ箇所ができるのではないでしょうか。
罫線は、データがある行までのほうが良いかと思います。
つまり、赤線で囲んだところは、罫線がない方がよいかと思います。
そのようにする方法は、データを作成完了後に罫線をマクロで引く方法です。
これについては、
https://oshiete.goo.ne.jp/qa/10717384.html
「年度別にカウントする転記マクロについて」で回答します。

>シートのクリアにつきまして、クリアしていない認識はあったのですが、クリアをしてしまうと書式設定や表の罫線が消えてしまうため盛り込めていませんでした。
>3行目以降クリアの場合でも罫線と書式設定が消えてしまいますが、(書式設定で、部署別増減一覧のみ0は非表示としていました)マクロでクリア処理を行う場合、全クリアではなくブランクを挿入するイメージの記述等はありますでしょうか?

そういうことでしたら、
Set ws = Worksheets("人員増減一覧")
ws.Range("A1:I5000").Value = ""・・・・...続きを読む

QExcel 数の数え方 種類の数を数えたい

Excelの質問です。同じ文字列が複数あった場合、それはいくつあっても1とカウントしたいのですが、なかなかうまくいかないので、お力を貸して下さい!

例として、添付画像のような表があったとします。
今回求めたいのは「色の種類」と「合計」です。

①「色の種類」は、その日に何種類の色を使用したか種類の数を求めたい

②「合計」は、1日に複数同じ色があってもそれは1と数えた状態で、すべての日数分の合計を求めたい

というものなのですが、どのような数式を使用すればよろしいでしょうか?
ご回答いただけると嬉しいです。
宜しくお願い致します!

Aベストアンサー

こんばんは!

一案です。
この質問限定の関数(ユーザー定義関数)を作ってみてはどうでしょうか?
(二つのユーザー定義関数を作ってみました)

Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに↓のコードをコピー&ペースト

Function nikkei(myRng As Range) '//この行から//
 Dim cnt As Long, c As Range, myStr As String
  For Each c In myRng
   If InStr(myStr, c) = 0 Then
    cnt = cnt + 1
    myStr = myStr & c & ","
   End If
  Next c
   nikkei = cnt
End Function

Function goukei(myArea As Range, c As Range)
 Dim i, cnt As Long, myRng As Range
  For i = myArea(1).Row To myArea(myArea.Count).Row
   Set myRng = Range(Cells(i, myArea(1).Column), Cells(i, myArea(myArea.Count).Column))
    If WorksheetFunction.CountIf(myRng, c) > 0 Then
     cnt = cnt + 1
    End If
  Next i
   goukei = cnt
End Function '//この行まで//

Excel画面に戻り(VBE画面を閉じて)通常の関数と同じ使い方をします。

画像の配置では、まずF2セルに
=nikkei(B2:E2)

という数式を入れ下へフィル&コピー!
B9セルに
=goukei(B$2:E$5,A9)

という数式を入れ下へフィル&コピー!

これでもお望みの結果になると思います。m(_ _)m

こんばんは!

一案です。
この質問限定の関数(ユーザー定義関数)を作ってみてはどうでしょうか?
(二つのユーザー定義関数を作ってみました)

Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに↓のコードをコピー&ペースト

Function nikkei(myRng As Range) '//この行から//
 Dim cnt As Long, c As Range, myStr As String
  For Each c In myRng
   If InStr(myStr, c) = 0 Then
    cnt = cnt + 1
    myStr = myStr & c & ","
   ...続きを読む

Q標準モジュールPublic宣言変数が破棄される現象

お世話になります。
エラー構文の雛形を作成中ですが、Public宣言変数(Public tgt As Variant)が変な動きになりましたので質問いたします。
a1)M01_Main[Module]を含むProject内別Moduleの宣言セクションでPublic tgt As Variant
a2)M01_MainのSub m01_Start[Procedur]中のCall文にブレークポイント(いかBP)を設定
a3)m01_Startからデバック/ステップイン/実行-継続(開始)
a4)⇒『tgt=ABC』~途中処理(極々簡単な処理)・・・
a5)⇒Dim arg_rslt As String,Dim arg_errInfArr(0 To 4) As String
a6)⇒Call S01_Ave.s01_01Data(arg_rslt, arg_errInfArr())【BPで停止】※
Call先へ飛び
b1)s01_01Data(ByRef arg_rslt As String, arg_errInfArr() As String)
b2)⇒『tgt=xyz』~途中処理・・・
b3))⇒EndSub⇒m01_Start
の構成で、※BPで停止後、F8キーでs01_01Dataにカーソル移動、その後に実行-継続すると、ダミーで仕込んだa側エラー/b側エラー発生に対し、意図した動作(tgt=xyz含み)でエラー表示後、終了します。
しかし、
※BPで停止後、m01_Start側から、実行-継続するとs01_01Data側でtgt=xyzとならず、tgt=””になってしまいます。
MSの言う『ほとんどの場合、・・・は保持されますが、意図しない・・・Public 変数の値が破棄され、・・・。 Public 変数がアプリケーション終了時まで有効であること・・・は、推奨されません。』とは、少し違うような・・・・

Q1:皆様は、このような事態に遭遇した事がありますか?
Q2:Public宣言変数の問題でなく他の問題か?(そうは言ってもF8キーなら意図した動作になるのだし・・・、デバックモードの問題?)
Q2:このような現象があると、ごく簡単な短期使用(数行で処理が終了する様な)であっても、Public宣言変数の使用は控えるべきなのか?

以上、よろしくお願いします。

お世話になります。
エラー構文の雛形を作成中ですが、Public宣言変数(Public tgt As Variant)が変な動きになりましたので質問いたします。
a1)M01_Main[Module]を含むProject内別Moduleの宣言セクションでPublic tgt As Variant
a2)M01_MainのSub m01_Start[Procedur]中のCall文にブレークポイント(いかBP)を設定
a3)m01_Startからデバック/ステップイン/実行-継続(開始)
a4)⇒『tgt=ABC』~途中処理(極々簡単な処理)・・・
a5)⇒Dim arg_rslt As String,Dim arg_errInfArr(0 To 4) As String
a6)⇒Ca...続きを読む

Aベストアンサー

こんばんは。

>お騒がせしました、自己解決ました。
一般論ではないのでしょうか?

Q1:一時期は、その変数をチェックするマクロを付けていましたが、プロシージャーであっても、パラメーター(引数)で与えたほうが安全です。

Q2:一度、内部でエラーを発生したら、Public変数など、いつの間にかなくなっています。

>Q2:このような現象があると、ごく簡単な短期使用(数行で処理が終了する様な)であっても、Public宣言変数の使用は控えるべきなのか?

Module内ならともかく、Project 全体で、変数の内容をメモリ内で共有させるのは無理があります。Public Const 以外は、Public 変数は避けたほうがよいというのは、ずっと私は変わりません。

Q数式中の書式設定は可能ですか。

宜しくお願いします。

タイトルの事ですが、具体的にはセルに下記の様に入力。
="tan-1(500/200)+"&A1
tan-1の部分をアークタンジェントに見せたいのですが、
-1を選択してもセルの書式設定が使えず困っています。
ただの数値でしたら-1の部分を選択後、文字飾りで上付きにするところなのですが。

もし書式設定が出来なくても他にいい方法があれば、ご教示下さい。

Aベストアンサー

色々試してみましたが、既にchonamiさんも回答されておられますとおり、「式の一部なら一般機能では無理」と思われます。
そこで、書式で設定するのはあきらめて、はじめから「上付き文字」を入力する方法を考えでみました。
IMEパッドを起動し、Unicodeの文字一覧の「上付き/下付きの文字」のカテゴリから上付きのマイナスを選択し、続いて「ラテンⅠ補助」のカテゴリから上付きの1を選択します。
(何故、「上付き/下付きの文字」のカテゴリに全て並んでいないのか私にはわかりません。)
これで、ご質問者の望んでいるスタイルになったのではないかと思います。
添付の画像を参照してください。

Qエクセルのユーザー定義関数について

エクセルのユーザー定義関数について教えてください。

ユーザー定義関数なるものがあると知り、関数を作成していました。
結構便利なものが作れそうだと分かり
http://kabu-macro.com/word/ya-yo/user_teigikansuul.html
の消費税計算を参考に、簡単な四則演算の計算式を組んでいました。
ある程度普段使う簡単だけど面倒だった数式を組んだのちに、
vlookup関数の代わりに、indexとmatch関数を良く使っているので、これをちょっと使ってvlookup_2という関数を作ろうとしていたのですが、
ユーザー定義関数には既存のワークシート関数を組み込むことはできないのでしょうか?
また組み込めるとしたら上記のindexとmatch関数をどのように配置したら良いのでしょうか?

Aベストアンサー

こんにちは

ユーザ定義関数は(マクロと同様)VBAという言語で記述しています。
ワークシートで利用する関数も(ほとんどのものは)利用することが可能です。

利用法は、例えばINDEX関数であれば
 WorksheetFunction.Index( ~~~ )
のように、WorksheetFunctionオブジェクトのメソッドとして呼び出せばよいです。
引数の内容はシートの関数とほとんど同じですが、一応、事前に確認なさった方がよろしいかと。
https://docs.microsoft.com/ja-jp/office/vba/api/Excel.WorksheetFunction.Index

なお、VBAから利用できるワークシート関数の一覧が以下にありますので、ご参考までに。
https://msdn.microsoft.com/ja-jp/library/office/ff822194.aspx
https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheetfunction

QVBAで複雑な構成の転記

はじめまして。

VBAで複雑な表の転記をする必要があり大変困っています(>_<)
内容は、社員別で8行1セットのデータを、1人当たり3行毎に転記し、評価一覧を作成したいです。

データイメージは画像のとおりです。
※結果は、1人当たり1-3段(行)に分けてそれぞれ転記したいです。

VBAに詳しい方がいらっしゃいましたら是非アドバイス頂けませんでしょうか。

【元データ】
・A列ーQ列のデータ
・1人8行セット
・3行目からデータ
列 項目
A 社員番号
B 氏名
C 会社
D 職位
E レベル
F レビュータイプ
G 総合評価
H 監督者評価(平均)
I 本人評価(平均)
J 目標
K 監督者評価1
L 本人評価1
M 監督者評価2
N 本人評価2
O 定義
P 監督者評価3
Q 本人評価3

【先データ】
・A-BO列のデータ
・1人3行セット
・5行目からデータ
列 行(1人目) セット項目
A 5-6    社員番号
B 5-6    氏名
C
D
E
F
G 5-6    レベル
H
I 5-6    会社
J
K
L
M
N
O 7    監督者評価(平均)
P 5    目標1
Q 5    目標2
R 5    目標3
S 5    目標4
T 5    目標5
P 6
Q 6
R 6
S 6
T 6
P 7    監督評価1
Q 7    監督評価1
R 7    監督評価1
S 7    監督評価1
T 7    監督評価1
U 7    監督評価2
V 7    監督評価3
W 7    監督評価3
X 7    監督評価3
Y 7    監督評価3
Z 7    監督評価3
AA 7    監督評価3
AB 7    監督評価3
AC 7    監督評価3
AD
AE
AF
AG
AH
AI
AJ
AK
AL
AM
AN
AO
AP
AQ
AR
AS
AT
AU
AV
AW
AX
AY
AZ
BA 5
BB 5    本人評価1
BC 5    本人評価1
BD 5    本人評価1
BE 5    本人評価1
BF 5    本人評価1
BB 7
BC 7
BD 7
BE 7
BF 7
BG 7    本人評価2
BH 7    本人評価3
BI 7    本人評価3
BJ 7    本人評価3
BK 7    本人評価3
BL 7    本人評価3
BM 7    本人評価3
BN 7    本人評価3
BO 7    本人評価3

はじめまして。

VBAで複雑な表の転記をする必要があり大変困っています(>_<)
内容は、社員別で8行1セットのデータを、1人当たり3行毎に転記し、評価一覧を作成したいです。

データイメージは画像のとおりです。
※結果は、1人当たり1-3段(行)に分けてそれぞれ転記したいです。

VBAに詳しい方がいらっしゃいましたら是非アドバイス頂けませんでしょうか。

【元データ】
・A列ーQ列のデータ
・1人8行セット
・3行目からデータ
列 項目
A 社員番号
B 氏名
C 会社
D 職位
E レベル
F レビュー...続きを読む

Aベストアンサー

以下のマクロを標準モジュールに登録してください。
転記先の見出し、罫線については、予め適切に設定されているものとします。
(マクロでは行いません。マクロはデータの転記のみ行います)
---------------------------------------------
Option Explicit
Public Sub 複雑な構成の転記()
Const Non As String = "-" 'データなし
Dim maxrow As Long
Dim row As Long
Dim row2 As Long
Dim ctr As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("データ")
Set sh2 = Worksheets("社員別評価一覧")
maxrow = sh1.Cells(Rows.Count, 1).End(xlUp).row 'sheetデータの最大行取得
If (maxrow - 2) Mod 8 <> 0 Then
MsgBox ("データの行不正")
Exit Sub
End If
sh2.Rows("5:" & Rows.Count).ClearContents 'Sheet社員別評価一覧の5行目以降をクリア
'転記を最後の行まで行う
ctr = 0
row2 = 5
For row = 3 To maxrow Step 8
sh2.Cells(row2, "A").Value = sh1.Cells(row, "A").Value '社員番号
sh2.Cells(row2, "B").Value = sh1.Cells(row, "B").Value '氏名
sh2.Cells(row2, "G").Value = sh1.Cells(row, "E").Value 'レベル
sh2.Cells(row2, "I").Value = sh1.Cells(row, "C").Value '会社
sh2.Cells(row2 + 2, "O").Value = sh1.Cells(row, "H").Value '監督者評価(平均)
sh2.Cells(row2, "P").Value = sh1.Cells(row, "J").Value '目標1
sh2.Cells(row2, "Q").Value = sh1.Cells(row + 1, "J").Value '目標2
sh2.Cells(row2, "R").Value = sh1.Cells(row + 2, "J").Value '目標3
sh2.Cells(row2, "S").Value = sh1.Cells(row + 3, "J").Value '目標4
sh2.Cells(row2, "T").Value = sh1.Cells(row + 4, "J").Value '目標5
sh2.Cells(row2 + 2, "P").Value = sh1.Cells(row, "K").Value '監督者評価1
sh2.Cells(row2 + 2, "Q").Value = sh1.Cells(row + 1, "K").Value '監督者評価1
sh2.Cells(row2 + 2, "R").Value = sh1.Cells(row + 2, "K").Value '監督者評価1
sh2.Cells(row2 + 2, "S").Value = sh1.Cells(row + 3, "K").Value '監督者評価1
sh2.Cells(row2 + 2, "T").Value = sh1.Cells(row + 4, "K").Value '監督者評価1
sh2.Cells(row2 + 2, "U").Value = sh1.Cells(row, "M").Value '監督者評価2
sh2.Cells(row2 + 2, "V").Value = sh1.Cells(row, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "W").Value = sh1.Cells(row + 1, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "X").Value = sh1.Cells(row + 2, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "Y").Value = sh1.Cells(row + 3, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "Z").Value = sh1.Cells(row + 4, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "AA").Value = sh1.Cells(row + 5, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "AB").Value = sh1.Cells(row + 6, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "AC").Value = sh1.Cells(row + 7, "P").Value '監督者評価3
sh2.Cells(row2, "BB").Value = sh1.Cells(row, "L").Value '本人評価1
sh2.Cells(row2, "BC").Value = sh1.Cells(row + 1, "L").Value '本人評価1
sh2.Cells(row2, "BD").Value = sh1.Cells(row + 2, "L").Value '本人評価1
sh2.Cells(row2, "BE").Value = sh1.Cells(row + 3, "L").Value '本人評価1
sh2.Cells(row2, "BF").Value = sh1.Cells(row + 4, "L").Value '本人評価1
sh2.Cells(row2 + 2, "BG").Value = sh1.Cells(row, "M").Value '監督者評価2
sh2.Cells(row2 + 2, "BH").Value = sh1.Cells(row, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BI").Value = sh1.Cells(row + 1, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BJ").Value = sh1.Cells(row + 2, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BK").Value = sh1.Cells(row + 3, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BL").Value = sh1.Cells(row + 4, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BM").Value = sh1.Cells(row + 5, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BN").Value = sh1.Cells(row + 6, "P").Value '監督者評価3
sh2.Cells(row2 + 2, "BO").Value = sh1.Cells(row + 7, "P").Value '監督者評価3
row2 = row2 + 3
ctr = ctr + 1
Next
MsgBox (ctr & "人の複雑な転記完了")
End Sub

以下のマクロを標準モジュールに登録してください。
転記先の見出し、罫線については、予め適切に設定されているものとします。
(マクロでは行いません。マクロはデータの転記のみ行います)
---------------------------------------------
Option Explicit
Public Sub 複雑な構成の転記()
Const Non As String = "-" 'データなし
Dim maxrow As Long
Dim row As Long
Dim row2 As Long
Dim ctr As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets...続きを読む

Qマクロで指定したフォルダーとエクセルブックを開く方法

エクセル素人ですが、マクロで指定したフォルダーとせくセルブックを開きたいのですが、ご教示をお願いいたします。
質問1:ボタンを押すと、[C:\マクロ練習]というフォルダーが開かれる
質問2:[C:\マクロ練習\ぶどう]というエクセルブックが開かれる
よろしくお願いいたします。

Aベストアンサー

こんにちは

両方とも、複雑な内容ではないので、検索すればすぐに見つかると思いますけれど?

以下一例です。
(内容の吟味はしていません)

質問1
https://blog.systemjp.net/entry/2015/05/13/234801
https://vbabeginner.net/%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/

質問2
https://www.tipsfound.com/vba/11005
http://officetanaka.net/excel/vba/file/file01.htm


人気Q&Aランキング