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

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

ただいまの
回答率

90.61%

  • MySQL

    5709questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

異なるViewControllerからTabBarControllerへの値渡し[Swift4,Xcode8]

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 222
退会済みユーザー

退会済みユーザー

前画面で入力したプロフィール情報を画面を移動した先(TabBarControllerの内の一つのView(Profile.swift))に表示したいです。
Profile_Setting.swiftのguard let profile = tab.~
*の部分を何を書けばいいのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ladybird

    2018/06/21 15:19

    「①と②のやり方がわかりません」とありますが、①と、②の途中まではできているような・・・?リストボックスを2列にする方法が分からないか、フォルダパスの取り方が分からないか、あたりでしょうか。②をもう少し分解して、分からない点を整理してみてください。(ちなみに、挙げたどちらかであれば検索で十分解決できるかと。)

    キャンセル

  • ladybird

    2018/06/21 15:23 編集

    あ、失礼、「フォーム上に」がポイントなんですね。それは自前でゴリゴリ作るくらいしかないんじゃないかなぁ・・・。なぜ普通のダイアログじゃダメなのかを記載していただければ、別なアプローチの回答は出てくるかもしれません。

    キャンセル

回答 3

+1

①ユーザーフォーム上にファイルを開くダイアログ、もしくはエクスプローラのような画面を表示

もしくはって言っててダイアログのは実現できているのでいいですよね。
もしフォーム上でエクスプローラー風の画面を作りたいなら、TreeViewコントロールなんかで実現できると思います。
TreeView自体は汎用的なものなので、自力でファイルを取得してツリーを構築する必要があります。
そこまでする必要があって自力でできなさそうなら改めて質問をあげてください。

パス名の取得は既にラベルに設定しているのでわからないわけではないですよね。
よってリストボックスの使い方がわからない、ということでよろしいでしょうか。
With内のみ抜粋ですが、こんな感じにすればよいかと思います。

        With Me.BookInput
            .Clear
            'リストボックスにファイル名を表示
            For Each Target In OpenFileName
                Filename = Dir(Target)
                Pathname = Replace(Target, Filename, "")
                .AddItem ""
                .List(BookInput.ListCount - 1, 0) = Filename
                .List(BookInput.ListCount - 1, 1) = Pathname
            Next Target
            'ファイルのあるフォルダーのパスをラベルに表示
            Me.lblPath.Caption = .List(0, 1)
        End With

ただこれって意味あります?
ファイル選択ダイアログで取得できるファイルは、同じフォルダが対象なので、全部の行に同じパスが設定されますし、ラベルにもパスが設定されます。
何がしたいのか要件を見直してみてください。

追記
リストボックスのColumnCountプロパティは2にしておいてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

VBA - VBA ツリービューからファイル印刷(132027)|teratail

上記の質問で希望に沿う回答がなかったので質問しなおしたのですね。
上記ではツリービュー以外の方法がいくつか提案されていたが、それでは満足できなかったということですね。

CheckBox付きTreeViewのTips紹介
にあるようなCheckBox付きTreeViewを使えばどうでしょう。このリンク先はC#ですが、VBAでも可能です。

かなりのスキルが必要になりますが、下記等を参考にチャレンジしてみてください。
Office TANAKA - Excel VBA Tips[TreeViewコントロールの使い方]

リストボックスの2列表示については、下記をご参考に。
Office TANAKA - Excel VBA Tips[複数列のリストボックス]

ツリービューで作成してみた

将来使うことがあるかもしれないので、ツリービューの勉強がてら作成してみました。

イメージ説明

ユーザーフォーム上にツリービュー(TreeView1)を配置します。
配置の仕方は上記の Office TANAKA のリンク先を参考にしてください。
他に下記のコントロールを配置します。
イメージリストと連携させてアイコンも表示できるようだが、私の環境ではエラーが出てアイコンが登録できなかったのでアイコンはなしです。

コマンドボタン
cmdBookPrint 選択したブックの印刷
cmdSelectFolder 親フォルダの選択

テキストボックス
txtRootFolder 親フォルダのパス格納用

ユーザーフォームのモジュール

Option Explicit

Private Sub cmdBookPrint_Click()
    Dim n As Node
    For Each n In TreeView1.Nodes
        If n.Checked And n.Children = 0 Then
            Debug.Print n.FullPath
        End If
    Next
End Sub

Private Sub cmdSelectFolder_Click()
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = txtRootFolder.Value
        .AllowMultiSelect = False
        .Title = "親フォルダの選択"
        If .Show Then txtRootFolder.Value = .SelectedItems(1)
    End With
    TreeView1.Nodes.Clear
    InitFileTreeView
End Sub

Private Sub UserForm_Initialize()
    txtRootFolder.Value = "C:\PFolder"
    With TreeView1
        .CheckBoxes = True
        .Indentation = 14           ''インデントの幅
        .LabelEdit = tvwManual      ''ラベル編集の許可
        .BorderStyle = ccNone       ''線の種類
        .HideSelection = False      ''非アクティブ時の選択解除
        .LineStyle = tvwRootLines   ''ルート(最上位)線の表示
    End With

    InitFileTreeView
End Sub

Sub InitFileTreeView()
    Dim objFSO As FileSystemObject
    Dim strDir As String
    Dim i As Long

    strDir = txtRootFolder.Value
    'FileSystemObjectのインスタンスの生成
    Set objFSO = New FileSystemObject
    'フォルダの存在確認
    If Not objFSO.FolderExists(strDir) Then
        MsgBox ("指定のフォルダは存在しません")
        Exit Sub
    End If
    '親フォルダーの登録、展開
    TreeView1.Nodes.Add(Key:="n0", Text:=strDir).Expanded = True
    i = 1    'キーインデックス
    '再帰処理モジュールのコール
    Call GetDirFiles(objFSO.GetFolder(strDir), i, "n0")
    'オブジェクトの解放
    Set objFSO = Nothing
End Sub

Sub GetDirFiles(ByVal objFolder As Folder, ByRef i As Long, ByVal PKey As String)
    Dim objFolderSub As Folder, objFile As File
    Dim n As Node
    'サブフォルダの取得
    For Each objFolderSub In objFolder.SubFolders
        i = i + 1
        Set n = TreeView1.Nodes.Add(Relative:=PKey, Relationship:=tvwChild, _
                            Key:="n" & i, Text:=objFolderSub.Name)
        Call GetDirFiles(objFolderSub, i, "n" & i)
        If n.Children = 0 Then
            TreeView1.Nodes.Remove n.Index
        Else
            n.Expanded = True
        End If
    Next
    'ファイルの取得
    For Each objFile In objFolder.Files
        With objFile
            If  .Type = "Microsoft Excel ワークシート" Then
                i = i + 1
                TreeView1.Nodes.Add Relative:=PKey, Relationship:=tvwChild, _
                                    Key:="n" & i, Text:=.Name
            End If
        End With
    Next
    'オブジェクトの解放
    Set objFolderSub = Nothing
    Set objFile = Nothing
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/21 16:47

    hatena19さん〉

    回答ありがとうございます

    以前質問した複数のフォルダの複数のファイルを表示させる質問で
    https://teratail.com/questions/131957

    ①のフォルダが固定じゃないときの場合の回答で→
    任意のフォルダから複数のファイルを選択するなら、リストボックスを2列表示にして、1列目にファイル名、2列目にフォルダーのパスを格納する。GetOpenFilenameメソッド選択したファイルをリストボックスに追加していくようにする。

    という回答を頂いたのですがGetOpenFilenameメソッドでは1つのフォルダが対象で複数のフォルダに対しては対象にできませんが、フォーム上ではなくファイルを開くダイアログでリストボックスに複数のフォルダの複数のファイルを表示させることは可能ですか?

    よろしくお願い致します

    キャンセル

  • 2018/06/21 17:01

    hatena19さん〉
    すみません質問を変えます。

    以前質問した
    https://teratail.com/questions/131198
    質問した時のコードでリストボックスないファイルの印刷はできますでしょうか?

    キャンセル

  • 2018/06/21 17:38 編集

    以前質問したコードに下記のコードを付けてリストボックス内のファイルを印刷しようとしたのですが
    フォルダが違うファイルがあるとエラーになってしまいました。
    https://teratail.com/questions/131198

    Private Sub btn_Cilck()
    dim wb As Variant
    dim Fn As Variant,i As Long

    with Me.BookInput
    For i = 0 To .ListCount -1
    Set wb = Workbooks.Open(.List(i,0))
    wb.PrintOut
    wb.Close
    Next
    End With
    Application.ScreenUpdating = True
    End Sub

    キャンセル

  • 2018/06/21 18:51 編集

    今までの回答やほかの方の回答で十分ヒントは出ていると思います。

    この質問のコード(以前私が回答したもの)の btn_FileOpen_Click で、
    .Clear(リストボックスのクリア)を削除して、
    For Each の部分を、ttyp03 さんの回答のものに置き換えて、
    Me.lblPath.Caption = .List(0, 1)を削除すれば、
    ファイルダイアログで選択したファイル名とパスがリストボックスに追加されていきます。

    印刷ボタンでワークブックを開く部分のコードは、

    Set wb = Workbooks.Open(.List(i,1) & .List(i,0))

    というようにパスとファイル名を & で結合すればいいでしょう。

    あとは「リストのクリア」ボタンを追加して、リストボックスをクリア出来るようにすればいいでしょう。

    キャンセル

  • 2018/06/22 11:35

    hatena19さん〉
    回答ありがとうございます
    ファイルのリスト表示、印刷、リスト削除
    できることができました。

    また質問があるのですが…

    'カレントディレクトリを指定
    ChDrive "C"
    ChDir "C:\test"

    上記のカレントディレクトリを指定仕方で
    サーバー(ネットワーク)のフォルダをカレントディレクトリとして指定することはできますか?

    パス→¥¥◯◯¥■■¥△△¥~

    よろしくお願い致します

    キャンセル

  • 2018/06/22 12:39

    「chdir ネットワークパス」をキーワードでネット検索すればすぐに見つかりますよ。
    ここで質問して回答をまっているより解決が早いと思います。

    キャンセル

  • 2018/06/22 13:56 編集

    hatena19さん〉

    下記を参考にしてカレントディレクトリをネットワークにしようとしたのですが、カレントディレクトリがローカルのままになってしまいました。

    https://excwlvba.blogspot.com/2013/07/blog-post_24.html?m=1

    Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long Sub S2_ChDir() '変更後パスFilePathの宣言 Dim FilePath As String '変更するファイルパスの指定 FilePath = "¥¥◯◯¥■■¥△△~" '変更の実行 Call SetCurrentDirectory(FilePath) End Sub

    キャンセル

  • 2018/06/22 18:10 編集

    当方の環境では問題なくネットワークのフォルダーがカレントになりましたよ。
    Private Sub btn_FileOpen_Click()
        Dim OpenFileName As Variant, Target As Variant
        'カレントディレクトリを指定
        Call SetCurrentDirectory("\\Server\myFolder")
        OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _
                                                   MultiSelect:=True)

    キャンセル

-1

「vba ファイル選択ダイアログ」でぐぐってみればどうでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/21 15:17

    y_waiwaiさん
    回答ありがとうございます
    ファイル選択ダイアログでファイルの選択はできますが、フォーム上にファイル選択ダイアログを表示する方法は質問する前に探してもなかったので質問致しました。

    キャンセル

  • 2018/06/21 15:23

    フォーム上にダイアログを表示するとはどういうことでしょう
    ふつうはフォームを表示した上にダイアログを表示しますが、そうではないということ?

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5709questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。