質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LibreOffice Calc

LibreOffice Calcは、様々なOSで利用可能なオフィススイートであるLibreOfficeに含まれるオープンソースの表計算ソフトです。テンプレートや背景色、枠線といった書式設定の各項目を柔軟で設定することができます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

6917閲覧

エクセルで作ったマクロをcalc で動かすと→BASIC ランタイムエラー. '423'  を解決したい

Yooshi

総合スコア4

LibreOffice Calc

LibreOffice Calcは、様々なOSで利用可能なオフィススイートであるLibreOfficeに含まれるオープンソースの表計算ソフトです。テンプレートや背景色、枠線といった書式設定の各項目を柔軟で設定することができます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/04/21 20:11

前提・実現したいこと

Excelでつかっていたマクロ(対象CSVファイルの一部をコピペする)を
OfficeLibre Calcのマクロとして使おうとしています。

その際に出てきたエラー423を解決したい。

発生している問題・エラーメッセージ

BASIC ランタイムエラー. '423' GetOpenFilename

該当のソースコード

VBA

1Rem Attribute VBA_ModuleType=VBAModule 2Option VBASupport 1 3Option Explicit 4 5Sub Copy() 6 7Dim csv As String 8Application.ScreenUpdating = False 9csv = Application.GetOpenFilename("csvfile,*.csv?") 10If csv = "False" Then Exit Sub 11Workbooks.Open csv, ReadOnly:=True 12With ActiveWorkbook.Sheets(1) 13 14 ThisWorkbook.Sheets("Sheet1").Range("C20:D25") = Range("A5:B10").Value 15 16 ThisWorkbook.Sheets("Sheet1").Range("E20:N25") = Range("E5:N10").Value 17 18 19Application.CutCopyMode = False 20.Parent.Close False 21End With 22Application.ScreenUpdating = True 23MsgBox "Done" 24End Sub 25

試したこと

コード先頭にOption VBASupport 1を入れてみた。

補足情報(FW/ツールのバージョンなど)

LibreOfficeは7.0.5.2(x64)です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LibreOfficeは詳しくないですがインストールして確認してみました。

その際に出てきたエラー423を解決したい。

とのことですが、どうしても「Application.GetOpenFilename」を使いたいということでしょうか。
「Option VBASupport 1」は、Excel VBAの処理が全てつかえると言う意味ではないのでは?

尚、以下にファイルダイアログのサンプルが記載してありました。

https://j11.blog.ss-blog.jp/2013-10-19-2

実行確認した所、ファイルダイアログが表示されました。
「com.sun.star.ui.dialogs.FilePicker」を使うという事みたいですね。

投稿2021/04/24 00:02

xail2222

総合スコア1497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yooshi

2021/04/27 15:31

xail2222様 ありがとうございます。 教えて頂いたcom.sun.star.ui.dialogs.FilePickerを使うことで、 ダイアログを表示することができました。 その後、csvファイルを直接指定範囲をコピペすることができませんでしたが、 sheet1に全部張り付けたデータに対し、指定の範囲をsheet2にコピペすることで やりたいことを実現することができました。 助かりました。
Yooshi

2021/04/27 15:38

xail2222様に教えていただいたURLの他に2件参考にし、 下記の様になりました。 'Calc にてcsvファイルを選択。csv全てをsheet1へ読み込み、sheet2へ指定範囲のみをコピペする rem 変数の宣言を必ず行うようにします。 Option Explicit rem #### .csvファイル用 #### ' 参考サイト ttps://ameblo.jp/t-spheres/entry-11014003570.html Sub ReadCsvFile rem '#### まず、変数の宣言 #### 'Calc(このドキュメント)用の変数 Dim objDoc As Object 'Sheetを指定するための変数 Dim objSheet As Object 'ファイル名 Dim strFileName As String 'ファイルの種類 Dim strFilterName As String 'ファイルを読み込むときの方法 Dim strOptions As String rem #### エラートラップ #### 'エラーがおきたら、ErrorHandlerに飛びます。 On Error Goto ErrorHandler '*************************** 'ファイル選択ダイアログを開いて、選択ファイルのパスを表示 ' 参考サイト ttp://openoffice3.web.fc2.com/OOoBasic_General.html#OOoGGBPh02a ' 参考サイト ttps://j11.blog.ss-blog.jp/2013-10-19-2 Dim oFP as Object Dim oAccept As Integer Dim oGetAFileName as String, oFileName as String Dim oDisp as String oFP = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") 'ファイル選択ダイアログが開く oAccept = oFP.Execute() If oAccept = 1 then 'Canncelの場合 iAccept <> 1 oGetAFileName = oFP.Files(0) 'file:///home/telstar/デスクトップ/1.ogv oFileName = ConvertFromUrl(oGetAFileName) '/home/telstar/デスクトップ/1.ogv End If 'msgbox 表示用 oDisp = "選択したfile名は" & Chr$(10) & "「 " & oFileName & " 」" & Chr$(10) & "ですね。" Msgbox(oDisp, 0, "FilePicker") '*************************** rem #### ここからマクロ本体 #### 'いま開いているCalcドキュメント objDoc = ThisComponent '読み込み先のシート objSheet = objDoc.getSheets().getByName("Sheet1") '読み込むファイル strFileName = ConvertToUrl(oFileName) 'テキストファイルであることを通知 strFilterName = "Text - txt - csv (StarCalc)" '44 :カンマ区切り '34 :引用符(") '0 :文字コードはPC標準の文字コードを使用 '2 :2行目から読み込む strOptions = "44,34,0,2," 'リンクモードでファイル読み込みを実行 '("_"を使うと1行のコマンドを複数行にすることができます。) objSheet.link(strFileName, "", strFilterName, strOptions, _ com.sun.star.sheet.SheetLinkMode.NORMAL) 'リンクモードを解除 objSheet.setLinkMode( com.sun.star.sheet.SheetLinkMode.NONE ) '*************************** '* 機能 : 指定したセル範囲をコピー貼り付け '*************************** ' 参考サイト ttp://abcdatasvc.seesaa.net/article/416242711.html Dim oSheetC As Object Dim oSheetP As Object Dim oRangeAddress As Object Dim oCellAddress As Object oSheetC = ThisComponent.Sheets.getByName("Sheet1") 'コピー元シートを特定しています oSheetP = ThisComponent.Sheets.getByName("Sheet2") '貼り付け先シートを特定しています oRangeAddress = oSheetC.getCellRangeByName("E1:F9").getRangeAddress() 'コピーする範囲を指定しています oCellAddress = oSheetP.getCellRangeByName("B10").getCellAddress() '貼り付け位置を指定しています oSheetP.copyRange(oCellAddress, oRangeAddress) '貼り付けしています Exit Sub 'エラーがおきたら、ここに飛んできます。 ErrorHandler: MsgBox "ReadCsvFile でエラー。 " & Chr(13) & Err & _ ": " & Error$ & " (" & Erl & "行目)", 0, "ImportData" End End Sub
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問