• 締切済み

VBAについての質問です

VBAの数式の設定で質問がございます。 各社員の勤務表にある毎月の各案件に対する作業時間を 1つの表にまとめたいと思います。 エクセルの場合は下記の数式となりますけど、人数と案件は多いですので、VBAを使って作業量を減らしたいと思います。 =HLOOKUP(A3,'[2014勤務表.xlsx]1月'!A1:D6,6,FALSE) VBAについての書き方を教えてください! よろしくお願いします!

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

No1の回答において、VBAコードの追加方法ですが以下のように訂正します。 ■VBAコードの追加 (1)Alt+F11でVBEを開く (2)挿入→標準モジュールから新規標準モジュールを作成 (3)作成した標準モジュールに最下のVBAコードを貼付 (4)Alt+F11でVBEを閉じる 失礼しました。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

■はじめに 取得元のデータ『2014勤務表.xlsx』において、 『1月』シートのセル『A1:D6』のフォーマットが同じであるとして ユーザー定義関数を作成しました。 ■処理について 『花子1』以外の名前について取得データがどこに どの様な位置関係で存在しているか提示されていませんので 以下のような処理を行っています。 「対象ブック」、「対象シート」の中の「名前」を検索し、そのセルを基準セルとします。 基準セルから開始及び終了セルまでのオフセット距離を指定 オフセット範囲とキーワードを用いてVlookupまたはHLookup関数により 取得した値を返します。 ■動作要件・条件 動作条件として取得元の様式は以下の要件を満たす必要があります。  (1)6行4列の範囲である  (2)左上のセルに名前が入っている  (3)名前の次の行が案件名である また、内部でVlookupまたはHLookup関数を使用しています。 適応条件を満たさない様式の場合正しく動作致しません。 ■VBAコードの追加 最下のVBAコードを以下の手順で集約先ブックへ追加してください。  (1)シートを右クリック  (2)コードの表示を選択  (3)VBAコードを貼付け ■使用方法 対象のブックを開いている必要があります。 『花子1』の『案件1』『1~12月』を対象として説明します。 C3セルに以下の数式を入力して、C14セルまでオートフィルしてください。 =集計("2014勤務表.xlsx",C$1,$B3,$A3,1,0,5,3,5,"h",TRUE) 数式は引数が多いですが以下の様式になります。 =集計(ブック名,名前,月,案件名,開始行,開始列,終了行,終了列,シフト量,タイプ,検索の型) ブック名 : 対象のブック名を指定 名前 : 基準セルを検索する名前のセルを指定 月 : 集計対象のシート名である月のセルを指定 案件名 : Lookup関数で使用するキーを指定 開始行 : 基準セルからの開始セルへのオフセット行値 開始列 : 基準セルからの開始セルへのオフセット列値 終了行 : 基準セルからの終了セルへのオフセット行値 終了列 : 基準セルからの終了セルへのオフセット列値 シフト量 : V or Hlookup関数で使用する行・列番号のオフセット量 タイプ : Lookup関数のタイプを「h」または「v」で指定 検索の型 : Lookup関数で使用する検索の型をTrueかFalseで指定 ■VBAコード Function 集計(book As String, _   key1 As Range, key2 As Range, key3 As Range, _   ost_r1 As Integer, ost_c1 As Integer, _   ost_r2 As Integer, ost_c2 As Integer, _   sft As Integer, sw As String, opt As Boolean) As Variant Dim myTar As Object Dim myRng As Range Set myTar = Workbooks(book).Sheets(key2.Value) Set myTar = myTar.Cells.Find(key1) If Not myTar Is Nothing Then   Set myRng = Workbooks(book).Sheets(key2.Value).Range( _     myTar.Offset(ost_r1, ost_c1), myTar.Offset(ost_r2, ost_c2))   If sw = "h" Then     集計 = WorksheetFunction.HLookup(key3.Value, myRng, sft, opt)   ElseIf sw = "v" Then     集計 = WorksheetFunction.VLookup(key3.Value, myRng, sft, opt)   End If End If End Function

mana19891008
質問者

お礼

詳しく教えて頂いて有難うございました。 助かりました。 これから試してみます。

関連するQ&A

  • VBAの書き方

    初歩的ですいません。 エクセルのVBAを利用してセル内に「"」を書き込むことは不可能なのでしょうか?? =if(A1="","","ok") と言う数式をVBAからセル内に書き込みたいのですがVBAで "" をプログラム上の文字として認識されてしまい書き込めません。 ご教授いただけないでしょうか??

  • エクセルVBA、マクロについて教えてください。

    https://box.yahoo.co.jp/guest/viewer?sid=box-l-62itttdrrgzrvsaxkvu53tmg3a-1001&uniqid=d4c90186-7ae6-4c7a-8f04-a499509147fc&viewtype=detail サンプルブックを見て頂きたいのですが、シートに分けておりますが、それぞれ別ブックとなります。 エクセルブックAにはシート1-シート10まであります。 ブックAのデータをVBAを使って、ブックBに転記したいのですが、 今はVBAがわからないため、作業列、関数を使って読み取っているのですが、検索をかけると、とても遅いため、関数を消すと早く検索が出来たため、VBAでデータを転記出来たらいいなと思っております。 いくつか条件があるのですが、 ブックAのAQ-ATが作業列としており、 ブックBのG-Uまで関数を入れております。 G4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,G$2) H4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A5,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,H$2) I4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,I$2) 同じような関数をG-Uまで入れております。 このような関数を入れております。 E4==VLOOKUP(A4,'[ブックA.xlsx]シート1'!$B:$AC,28,FALSE) この関数をなくすとAdvancedFilterが早くなるので、ここの部分を転記出来たらと考えております。 ブックAとブックBはブックAのB列のコードとブックBのA列のコードが一致すれば、転記すると言った感じです。 決まっている部分は、商品コードは重複しないのと、ブックAのB列は結合されております。 結合セルのため、作業列を使用しておりました。 ブックAの基準をかえずに転記できる方法があればおしえてください。

  • エクセルVBAについて質問です。VBAを初めて1カ月くらいなので、簡単

    エクセルVBAについて質問です。VBAを初めて1カ月くらいなので、簡単な質問かもしれませんが、よろしくお願いします。 Cells(1, 1).Value = "'1/" + TextBox1.Value 上のコードの"'1/"の部分で質問なのですが、例えばTextBox1.Value=2の場合、セルA1には「1/2」と表示されます。そしてこの「1/2」を数式として扱おうとするとエラー(#VALUE!)になります。その原因はセルA1をクリックすると、メニューとシートの間にある「fx」の右側の部分に「'1/2」と表示されているからだと思うのですが…。 これを数式として扱う何か良い方法はありませんか?シートを扱って解決するのではなくVBAを扱って解決したいのですが…。

  • エクセルVBAの質問です

    エクセルVBAの質問です 今勤務表を作成しているのですが 日1・日2・遅1・遅2・早1・早2・休 等を自動的にランダムで振り分けることはできるのでしょうか? 拙い説明でわかりにくいと思いますが、どうぞよろしくお願いします。

  • エクセル2007VBAの質問です。

    エクセル2007VBAで下記の事をしたいのですがうまくいきません。 ・エクセルシートの数式を消して値を残したものを別名で保存する。 ※保存時は「名前をつけて保存」ダイアログを出したいです。 現在は、下記内容で記述してみましたが、保存されません。 初心者がネットで調べて書いたので、めちゃくちゃな所があると思いますが宜しくお願いします。 ------------------------------------------------------------- Sub シートコピー() ' ' シートを別のブックにコピーする。 ' ' Const cnsTITLE = "エクセル作成" Const cnsFILTER = "エクセルファイル (*.xls),*.xls" Const xlsfile = "C:\temp\ファイル名を入力して下さい。" ' Columns("A:R").Select Selection.Copy Workbooks.Add Columns("A:A").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Set xlsApp = Application xlsApp.StatusBar = "出力ファイル名を指定して下さい。" strFILENAME = xlsApp.GetSaveAsFilename(InitialFileName:=xlsfile, _ FileFilter:=cnsFILTER, title:=cnsTITLE) End Sub -------------------------------------------------------------

  • VBAでわからなくなってしまったので質問します。

    VBAでわからなくなってしまったので質問します。 初心者なのですが、下記の問題にあたってしまい困っています。 製品Aと製品B~xまでEXCEL2007で表を作ってあります。 A~xまで同じVBA構文を使っていますが、 Aは名前を付けて保存すると 製品名A2456【0506】と製品名+コード番号+年月になります。 しかし、B~xは製品名B~Xのみがファイル名になってしまいます。 構文A~xともRangeの参照以外共通で下記です。 Sub 最終保存() Dim wSeq As String Dim wStr As String Dim Flnm As String Dim wFlnm As String ' Flnm = "C:\Documents and Settings\user\My Documents\受検ファイル\受検済み\" '←保存先フォルダ Flnm = Flnm & Range("B11") & Range("G20") & Format(Range("B6"), "【mmdd】") '←保存ファイル名 Flnm = Application.GetSaveAsFilename(InitialFileName:=Flnm, _ filefilter:="Excel ファイル (*.xlsx), *.xlsx", Title:="名前を付けて保存") If Flnm = "False" Then Exit Sub End If ' wSeq = 0 ExitFlg = False wFlnm = Flnm Do While ExitFlg = False If Dir(Flnm) <> "" Then '存在したら、連番を加算 wSeq = wSeq + 1 wStr = "(" & wSeq & ")" Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xlsx" Else '存在しない時、保存 ActiveWorkbook.SaveAs Filename:=Flnm, FileFormat:=xlOpenXMLWorkbook ExitFlg = True End If Loop End Sub Rangeの「B11」が製品名、「G20」がコード番号、「B6」が2010年5月○日という日付になっています。 なお、最初のRange("B11")を取り除くとコード+日付がファイル名になります。 なぜ、製品Aは出来てB~xが出来ないのか分かりません。 アドバイスお願いします。

  • エクセルVBAについて

    はじめてのVBAで本を読んでも使い方がわからないので教えてほしいのですが シート1にこのような表を作成して   A    B    1山田   500 2伊藤 20000 3佐藤    50 ・ ・ ・ シート2に    A   B    C 1    請求書 2 3 山田 4 500円 というような請求書を印刷していくVBAを作りたいのですが人数については10人から300人とその時々で変化するのでデータがないときは 印刷もそこで終わりという風にしたいのですが、、、 よろしくお願いします。 エクセル2003 XPです。

  • EXCEL VBA 数式を含めたコピー貼り付け

    お世話になります。 VBAを使ってブック間でコピー貼り付けするロジックを以前ご教授いただきましたが、結果が値貼り付けになってしまうため、数式を含めたコピー貼り付けをしたいのです。 A.xlsxというブックがあります。 この中に[データ]と[作業用]という2つのシートがあります。 [データ]シートに会社の1ヶ月の売上げデータが貼り付けています。 [作業用]シートのボタンを押したら[データ]シートのデータをA列に入っている担当者毎にファイルを分割してC:\dumy配下に作成するロジックを色々な方からご教授いただきまして作成しました。 動きはまったく問題ないのですが、下記ロジックの「ここ」部分でのコピーペースト時に値貼り付けしてしまっているため[データ]シートにあった数式がC:\dumy配下に出来上がったファイルには数式がなくなってしまう状態です。 数式も含めて全て貼り付けたいのですが、下記ロジックの[ここ]部分をどのように変更してよいのかが分りません・・ どなたかご教授いただけますでしょうか? よろしくお願い致します。 Sub ボタン_Click() Dim s0 As Worksheet Dim h Application.ScreenUpdating = False Worksheets("データ").Copy before:=Worksheets(1) Set s0 = Worksheets(1) Do Until Application.CountA(s0.Range("A:A")) < 2 h = s0.Range("A2").Value s0.Range("A1").AutoFilter field:=1, Criteria1:=h With Worksheets.Add ここ→ s0.AutoFilter.Range.Copy Destination:=.Range("A1") .Name = h .Move ActiveWorkbook.SaveAs Filename:="C:\dumy\" & h & ".xlsx" ActiveWorkbook.Close False s0.AutoFilter.Range.Offset(1).Delete shift:=xlShiftUp End With Loop Application.DisplayAlerts = False s0.Delete MsgBox "データをEXCELに表示します。" End Sub

  • VBAで複数の数式セルを最終行までコピーするには?

    エクセルで下記のような表を作成しています。    A   B   C   D 1 項目1 数式 数式 数式 2 項目2 3 項目3   ・   ・   ・ B1~D1の数式は項目1を参照したものです。 この時、2行目以下~最終行まで数式をコピーするには、 どのようなVBAを書けばよいでしょうか? よろしくお願い致します。

  • エクセルVBA ファイル名操作

    エクセルマクロのコードにおきまして 「フォルダの選択」ダイアログから エクセルファイル 123.xlsxを例えば 開くときに それをa.xlsxという名前に変えて 以下のそれに続くVBAコードにおいて a.xlsxを操作したいのですが、 a = Application.GetOpenFilename() Workbooks.Open a これを実行すると求めるダイアログが表示されて 使いたい123.xlsxを開くをクリックしますが これでは123.xlsxがa.xlsxにはなりません このa.xlsxのファイル名で別途ファイル作成する方法を 御教示いただけると助かります よろしくお願いします win10 office365 コードは以下 部分ですが こういう流れで作成したい所存です Sub あいう() a = Application.GetOpenFilename() Workbooks.Open a 'b.xlsxファイルを新規作成 Workbooks.Add ActiveWorkbook.SaveAs Filename:="C:\Users\USER\Desktop\あいう\b.xlsx", FileFormat:=xlXMLSpreadsheet 'a.xlsxファイルの1行目のA1~AG1のセルの値をコピー Workbooks("a.xlsx").Worksheets("Sheet1").Range("A1:AG1").Copy 'b.xlsxファイルのA3~AG3のセルに貼り付け Workbooks("b.xlsx").Worksheets("Sheet1").Range("A3:AG3").PasteSpecial xlPasteValues 以下省略 よろしくお願いします

専門家に質問してみよう