Excel VBAのコンパイルエラーが発生し、RoundUp関数が未定義です。

このQ&Aのポイント
  • Excel VBAのコードでRoundUp関数を使用している際にコンパイルエラーが発生し、'SUBまたはFunctionが定義されていません'というエラーメッセージが表示されます。
  • コードの修正方法としては、RoundUp関数を使用するためにVBAプロジェクトの参照設定を行う必要があります。
  • 具体的には、Visual Basic for Applicationsエディタ内でツールメニューの「参照設定」を開き、Microsoft Excelオブジェクトライブラリを選択して有効にします。
回答を見る
  • ベストアンサー

RoundUpでコンバイルエラーが出ます

よろしくお願いします。 For Each shp In Sheets("施工写真【塗装】").Shapes EndRow = Application.Max(EndRow, shp.BottomRightCell.Row) Next UserForm1.Label3.Caption = "ページ数は " & RoundUp(((EndRow) / 44), 0) & " ページです" と、するとRoundUpのところで ”コンバイルエラー” ”SUBまたはFunctionが定義されていません” と表示されます。 修正方法を教えてくださいませ。 悪戦苦闘しておりますが、私の能力では解決できそうにありません。

  • 1211M
  • お礼率54% (90/165)

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.4

WorksheetFunction.RoundUp(((EndRow) / 44), 0) or Application.RoundUp(((EndRow) / 44), 0) でしょうか。 また、私だったら、 さらに、String型に変換します。

1211M
質問者

お礼

HohoPapaさん 早速のご返答ありがとうございます。 解決しました。すっきりです。

その他の回答 (3)

  • masatsan
  • ベストアンサー率15% (179/1159)
回答No.3

No2です。回答は多分間違いです。申し訳ありません。

  • masatsan
  • ベストアンサー率15% (179/1159)
回答No.2

vbaの参照設定で適切なものを入れる必要があるかと。 何が適切であるか忘れた。

noname#232800
noname#232800
回答No.1

数値を文字にしないと。

1211M
質問者

お礼

gobou_pooさん 早速のご返答ありがとうございます。 解決しました。

関連するQ&A

  • H列の画像の下に画像を挿入できるようにしたい

    H列の画像の下に画像を挿入できるようにしたいです。 マクロを組んでみたのですが、A列に画像があった場合、 その下に画像が挿入されてしまいます。 H列のみで判断して挿入するにはどうすればよろしいでしょうか。 Sub 改修後写真添付() Dim FileName As Variant Dim I, F, endRow As Long Dim sheetName As String Dim shp As Shape sheetName = ActiveSheet.Name FileName = Application.GetOpenFilename(MultiSelect:=True) On Error GoTo err_shori If Range("H5") = "" Then I = 5 Range("H5").Value = "画像添付" Else For Each shp In ActiveSheet.Shapes endRow = Application.Max(endRow, shp.BottomRightCell.Row) Next I = 2 + endRow End If For F = 1 To UBound(FileName) With Sheets(sheetName).Pictures.Insert(FileName(F)) .Top = Range("H" & I).Top .Left = Range("H" & I).Left .Width = "170" .Height = "165" .Cut End With With Sheets(sheetName) .Range("H" & I).Select ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False End With I = I + 14 Next F MsgBox UBound(FileName) & "個の画像ファイルが挿入されました。" Exit Sub err_shori: MsgBox "キャンセルされました。" End Sub

  • Excel VBAについて

    Excel VBAにおいて、Sheetの選択した行によって値を表示するUserFormを変更したいと思っています。 現在以下のようにしたのですが、実行すると「SubまたはFunctionが定義されていません」というエラーが表示されます。 「Controls("UserForm" & x).Label1.Caption =」のところをどのようにしたらよいのでしょうか。 Private Sub CommandButton1_Click()   If ActiveCell.Row = 5 Then     UserForm1.Show     x = 1   ElseIf ActiveCell.Row = 6 Then     UserForm2.Show     x = 2   End If End Sub Private Sub Worksheet_Selection Change(Byval Target As Range)   Controls("UserForm" & x).Label1.Caption = ・・・

  • 写真をリンクではなく挿入する

    リンク元の写真を削除して開くと 「元のリンクされたイメージを表示できません・・・・」と、なります。 ならないようにするための、挿入方法を教えてください。 拙策な質問ですが、よろしくお願いします。 Application.ScreenUpdating = False Dim EndRow As Long Dim j As Integer Dim shp As Shape Dim myFolder As String, myFile As String For Each shp In ActiveSheet.Shapes EndRow = Application.Max(EndRow, shp.BottomRightCell.Row) Next Worksheets("施工写真【T】").Cells((EndRow) + 3, 3).Activate With Application.FileDialog(msoFileDialogFolderPicker) .Title = "*** 対象フォルダを選択し、[OK]をクリック ***" .InitialFileName = "D:\" If .Show = True Then myFolder = .SelectedItems(1) myFile = Dir(myFolder & "\*.jpg") Do While myFile <> "" ActiveSheet.Pictures.Insert(myFolder & "\" & myFile).Select With Selection .Top = ActiveCell.Top .Left = ActiveCell.Left .Width = ActiveCell.Width * 14 .Height = ActiveCell.Height * 8 End With ActiveCell.Offset(11, 0).Activate myFile = Dir() Loop Else Exit Sub End If End With 写真整理.写真NO.Value = ((EndRow) / 11) Worksheets("施工写真【T】").Cells(1, 1).Value = 1 For j = 11 To EndRow Step 11 Worksheets("施工写真【T】").Cells(j, 1).Value = Cells(j - 11, 1) + 1 Next j ActiveCell.Offset(0, 0).Activate Unload Me 写真整理.Show vbModeless Application.ScreenUpdating = True

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • 既存のエクセルマクロに命令文を追加

    既存のマクロに別の命令文を追加する場合について質問です。 選択した範囲のオブジェクトを削除するマクロがあります。 下の命令文に 「シート2でも同じことをする(ただし選択範囲はC30からG33)」 を追加する場合には、どのように書けばいいのでしょうか? Sheets("シート1").Select Range("A65:E365").Select Dim shp As Shape Dim rng_shp As Range 'セルが選択されていないときは終了 If TypeName(Selection) <> "Range" Then Exit Sub 'アクティブシートのすべての図形にループ処理 For Each shp In ActiveSheet.Shapes '図形の配置されているセル範囲をオブジェクト変数にセット Set rng_shp = Range(shp.TopLeftCell, shp.BottomRightCell) '図形の配置されているセル範囲と '選択されているセル範囲が重なっていれば図形を削除 If Not Intersect(rng_shp, Selection) Is Nothing Then shp.Delete End If Next Sheets("シート0").Select Range("A1").Select 同じものを上記命令文の下にコピーして選択シートと範囲を直すだけだと、 Dim shp As ShapeとDim rng_shp As Rangeがエラーになります。 どなたかご教示お願いします。

  • エクセルVBA/シェープの文字列を取得

    エクセル2010です。 BOOK内の各シートにボタンやチェックボックス、ラベルやテキストボックスなどが配置されています。 これらの貼り付けられたものの一覧を作りたいのです。 Sub obj_Check() Dim st Dim sp Dim i As Long For Each st In Sheets For Each sp In st.Shapes i = i + 1 With Sheets("Sheet3") .Cells(i, "A").Value = sp.Name ' .Cells(i, "B").Value = sp.Caption ’これがエラー .Cells(i, "C").Value = st.Name End With Next sp Next st End Sub とやってみましたがsp.Captionがエラーになります。 .Cells(i, "B").Value = sp.Shapes.Range.Character.Text としても同じです。 どうやったら、シェープに書かれた文字列が取得できるのでしょうか?

  • オートシェープをグルーピングして動作させたい

    office365 2つのオートシェープをグルーピングして図形を動作させたい 下記で kibanは平行四辺形のオートシェープ yajirushiは右向き矢印のオートシェープ で、それぞれ、ある範囲で左から右に移動を繰り返します。 この2つのオートシェープをグルーピングして 平行四辺形の右側に矢印を配置した状態で、そのグルーピングされた図形の動作を繰り返す様にしたいのですが、 その内容が分からないのでコードで教えていただきたく、よろしくお願いします。 #If Win64 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) #Else ' Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If Sub kiban() shape_delete Dim ws2 As Worksheet Dim i As Integer Set ws2 = Sheets("sheet1") ws2.Shapes.AddShape(msoShapeParallelogram, 2265, 354, 46, 20).Select With Selection.ShapeRange.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 176, 80) .Transparency = 0 .Solid End With ws2.Shapes.AddShape(msoShapeParallelogram, 2265, 458, 20, 20).Select ws2.Shapes(ws2.Shapes.Count).name = "kiban" For i = 0 To 30 If i = 30 Then i = 0 End If ws2.Shapes(1).Left = i * 3 + 365 ws2.Shapes(1).Top = 458 Sleep 100 DoEvents Next i ws2.Shapes("kiban").delete End Sub Sub yajirushi() shape_delete Dim ws As Worksheet Dim i As Integer Set ws = Sheets("sheet1") ws.Shapes.AddShape msoShapeRightArrow, 2265, 458, 20, 20 ws.Shapes(ws.Shapes.Count).name = "yajirushi" For i = 0 To 30 If i = 30 Then i = 0 End If ws.Shapes(1).Left = i * 3 + 420 ws.Shapes(1).Top = 458 Sleep 100 DoEvents Next i ws.Shapes("yajirushi").delete End Sub Sub shape_delete() Dim shp As Shape Dim rng As Range Range("P22:CM28").Select If TypeName(Selection) <> "Range" Then Exit Sub For Each shp In ActiveSheet.Shapes '‘ 図形の配置されているセル範囲をオブジェクト変数にセット Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) '‘ 図形の配置されているセル範囲と '‘ 選択されているセル範囲が重なっているときに図形を削除 If Not (Intersect(rng, Selection) Is Nothing) Then shp.delete End If Next End Sub

  • [VBA] For文の使い分けについての疑問

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) ・疑問点 For each nextもFor nextも、最下行まで処理をしたいときに使用することが多いのですが、 単列の場合はFor each next、複数列の場合はFor nextというような使い方をしています。 例:For each next Sub test()  Dim ws As Worksheet  Dim r As Range  Dim endRow As Long  Set ws = ThisWorkbook.Sheets(1)  endRow = ws.Cells(Rows.Count, 1).End(xlUp).Row  For Each r In ws.Range("A1:A" & endRow)   If r.Value Mod 2 = 0 Then r.Font.Bold = True  Next r End Sub 例:For next Sub test2()  Dim ws As Worksheet  Dim i As Long  Dim endRow As Long  Set ws = ThisWorkbook.Sheets(1)  endRow = ws.Cells(Rows.Count, 1).End(xlUp).Row  For i = 1 To endRow   If ws.Cells(i, 1).Value Mod 2 = 0 Then ws.Cells(i, 1).Font.Bold = True   If ws.Cells(i, 2).Value Mod 3 = 0 Then ws.Cells(i, 2).Font.Bold = True  Next i End Sub 単純に、複数列での処理をする場合にはFor each next文を2つ書かないといけないと思い(込み)、 上記のような運用にしていますが、そもそもこの考え方は合っていますでしょうか? 単列の処理であってももちろんFor next文で問題なく使用できますし、 複数列の処理の場合もFor each next文で処理することはできます(冗長ですが)が、 VBA的に正しいというか、合理的な考えであるのかどうかが疑問です。 みなさんはFor each nextとFor nextをどのように使い分けていますか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • エクセル VBA ワークシートの保存

    マクロ初心者です。毎回質問させていただいております。 今回もどうぞよろしくお願いします。 今回は、目的のワークシートを、新たにワークブックに保存するやり方を教えてください。 (状況) セルD2に、文字が入力してあります。 B2~M50列に、表があります。 また、ワークシートには、マクロを登録したボタンが、4~5個あります。 (P列ぐらいに。ただ、今後場所を変更する可能性があり、今後増える可能性あり) ※やりたいこと ・B列~M列ごと、書式、行列幅、書式をそのまま保存したい。 ・保存ボタンを適当に作り、そのボタンを押しらたら、D2に入力してある文字を、ファイル名として保存したい。(拡張しは、.xlsで) ・名前をつけて保存する時に出てくる、ダイアログ(?)で保存する場所を自由に選びたい ・ボタンは、新規ワークブックで消したい。 それで、作成したマクロは(ネットで調べて、そのままですが・・・)以下です。 エラーが出てしまいます。 お忙しい中、申し訳ありませんがどうぞよろしくお願いします。 Worksheets("点数表").Copy Application.Dialogs(ActiveWorkbook.SaveAs).Show Arg1:=Range("D2").Value Dim i As Long Dim Shp As Shape For i = 1 To Sheets.Count Sheets(i).Activate For Each Shp In ActiveSheet.Shapes Shp.Delete Next Shp Next i Range("o:s").Delete End Sub

  • VBAコードでシート名を取得したい。

    下記のコードは、指定したExcelブックにある情報をVBAコードを設置したブックに 情報を取得するコードになります。 質問なんですが・・・指定したExcelブックは、予めSheet名までをVBAコードで指定し、 そのSheetの内容を取得していますが、この部分を指定したSheet名ではなく、 Sheet名を取得し、取得したSheet名から自分で選択したSheetを選んび、 そのSheetの内容を取得する様に変えたいと考えています。 取得する側のSheet名が一定の名前になっていない為、 今までSheet名を変えて情報を取得する様にしていたのを 変えずに情報を取得したいと思ったからなんですが・・・ どの様に変えればできるのか初心者のためよろしくお願いします。 できましたら・・・UserForm2を使ってComboboxに取得するSheet名を 一覧化し、そのComboboxからSheet名を選べる様にしたいと思います。 ----------------------------------------------------------------------------------- Public Day As String '全プロシージャーで有効な変数 Sub CommandButton1() If MsgBox(Space(6) & "メールデータを取込みます。よろしいですか?", vbYesNo, "継続確認") = 7 Then Exit Sub Dim LstWb As Workbook Dim LstWs As Worksheet Dim OutWs As Worksheet Dim LstDt As Variant Dim EndRow As Long Dim Day0 As String Dim Day1 As String Dim i As Long Dim j As Integer Dim k As Long Set LstWb = Workbooks.Open(ThisWorkbook.Path & "\テストファイル.xlsm") Set OutWs = ThisWorkbook.Sheets("Sheet1") Set LstWs = LstWb.Sheets("Sheet1") EndRow = LstWs.Cells(Rows.Count, 1).End(xlUp).Row With LstWs LstDt = .Range(.Cells(1, 1), .Cells(EndRow, 5)) End With LstWb.Close Set LstWb = Nothing Set LstWs = Nothing Load UserForm2 With UserForm2 Day0 = LstDt(2, 4) .ComboBox1.AddItem Day0 For i = 2 To EndRow With .ComboBox1 Day0 = .List(.ListCount - 1) Day1 = LstDt(i, 4) If Day0 <> Day1 Then .AddItem Day1 End If End With Next i .ComboBox1.Value = .ComboBox1.List(0) End With UserForm2.Show For i = 1 To 5 OutWs.Cells(1, i).Value = LstDt(1, i) Next i k = 2 For i = 2 To EndRow Day0 = LstDt(i, 4) If Day = Day0 Then For j = 1 To 5 OutWs.Cells(k, j).Value = LstDt(i, j) Next j k = k + 1 End If Next i Set OutWs = Nothing LstDt = Empty UserForm1.Show (vbModeless)End Sub