スキップしてメイン コンテンツへ

 none
if文 MaxCol = Columns.Countに関して RRS feed

  • 質問

  •  はじめまして、御教授を御願いしたいのですが、下記の様なExcelでCSVファイルがるのですが列が最大でが最大で(A:AA)、行が最大で(1:18)あります。

    (例)

    3 6 コールザチューン 3 54 田辺裕信 1.21.9 54.6 1 1 35.78 34.2 1 3.3 478 -6 (美) 上原博之 500
    1 2 ホーリーライン 3 54 戸崎圭太 1.21.9 クビ 57.3 7 8 36.15 33.7 9 32.9 428 2 (美) 矢野英一 200
    8 16 コスモエスパーダ 3 56 柴田大知 1.22.0  1/2 56.4 7 6 36.08 33.9 4 6.6 466 -2 (美) 中野栄治 130
    4 7 フジマサディープ 3 54△ 野中悠太 1.22.0 56.4 4 6 36.08 33.9 6 19.7 490 -4 * (美) 菊川正達 75
    6 11 ゴールデンゾーン 3 56 レーン 1.22.1  3/4 56.6 7 8 36.15 33.9 2 3.6 484 0 (美) 相沢郁 50
    7 13 ヴォアラ 3 54 大野拓弥 1.22.2  1/2 56.9 10 10 36.23 33.9 8 30.3 474 -2 (美) 新開幸一 0
    B 5 10 ホットスタンプ 3 54 江田照男 1.22.4 1 1/4 54.7 4 3 36 34.4 15 231.6 448 -4 * (美) 菊川正達 0
    8 18 ミヤビペルラ 3 54 吉田豊 1.22.6 1 1/4 57.2 12 13 36.45 34 14 186.2 430 -8 (美) 高橋文雅 0
    2 4 トーセンジンライム 3 56 藤岡佑介 1.22.6 クビ 56.7 13 11 36.38 34.1 5 14.8 442 -6 (美) 古賀史生 0
    5 9 チャーチスクエア 3 54 石橋脩 1.23.0 2 1/2 51.8 2 2 35.85 35.2 3 4.1 462 -12 * (美) 古賀慎明 0
    3 5 スターアイランド 3 54 内田博幸 1.23.1  1/2 56.2 13 14 36.53 34.4 7 29.4 408 -2 * (美) 古賀慎明 0
    7 14 ニシノテンカラット 3 53☆ 武藤雅 1.23.3 1 1/4 51.5 4 3 35.93 35.4 12 89.9 400 2 (美) 武市康男 0
    8 17 フレエル 3 54 三浦皇成 1.23.4  1/2 57.9 17 17 36.9 34.2 11 65.2 430 (美) 萩原清 0
    4 8 エンジェルズライン 3 54 荻野極 1.23.4 クビ 56.8 16 15 36.75 34.4 17 413.6 434 0 (美) 田中剛 0
    2 3 トランスアクスル 3 56 松山弘平 1.23.6 1 1/2 53.6 10 11 36.38 35.1 10 55.7 490 2 (美) 中川公成 0
    6 12 オトリコミチュウ 3 52△ 菊沢一樹 1.23.8 1 50.1 3 3 35.93 35.9 16 271.9 442 -2 (美) 奥平雅士 0
    7 15 サクラテゾーロ 3 54 横山典弘 1.24.2 2 1/2 54.4 15 15 36.75 35.2 13 110.6 416 4 (美) 田島俊明 0
    1 1 ルーナフォンテン 3 54 岩部純二 1.24.8 3 1/2 55.7 17 18 37.2 35.2 18 539.4 450 -6 (美) 石毛善彦 0

    列数が26列より少ない場合にL列で列挿入をし、又列数が26で最終列に文字列"(地)","(外)", "(外)(地)"が有る時にもL列に文字挿入をしたいのですが、

    Dim string1 As String, string2 As String, string3 As String
        string1 = "(地)"
        string2 = "(外)"
        string3 = "(外)(地)"

        Range("A1:AA18").Select
        '列数が26より小さいかの判定
        If MaxCol = Columns.Count < Range("Z18") Then
        'L列に列挿入
        Columns("L:L").Insert
        '列数が26等しく尚且つ文字列"(地)","(外)", "(外)(地)"Trueの場合
        ElseIf MaxCol = Columns.Count = Range("Z18") And InStrRev(string1, string2, string3) Then ←エラー箇所
        'L列に列挿入
        Columns("L:L").Insert
        End If

    エラー出力内容

    実行時エラー'13'

    型が一致しません。

     宜しく御教授を御願い致します。

    2019年9月17日 10:00

すべての返信

  • エラー発生の直接的な原因は、InStrRevの3番目の引数が文字列(string3 )になっているからだと思いますよ。

    というかそれ以前に、文章通りの動きをさせるにはほど遠い・・・


    2019年9月17日 17:13
  • こんな感じでしょうか。

    Option Explicit
    
    Sub test()
        Dim 対象範囲 As Range, 列 As Range, 行 As Range
    
        ' (※) 対象のワークブックやワークシートが
        ' アクティブでないときは事前にアクティブに
        ' するなどの処理が必要
    
        ' 使用領域 (対象のセル範囲) を取得する
        ' A1 から対象範囲内の最終行と最終列まで
        ' 完全な空白がないことが前提
        Set 対象範囲 = Range("a1").CurrentRegion
    
        ' 範囲を行単位でループする
        For Each 列 In 対象範囲.Rows
            ' 行の使用領域を取得する
            Set 行 = 列.Resize(, 列.Offset(, 列.Columns.Count).End(xlToLeft).Column).Columns
    
            ' 行の列数が 26 未満の場合、L 列にセルを挿入する
            If 行.Count < 26 Then
                セル挿入 行
    
            ' 行の列数が 26 の場合
            ElseIf 行.Count = 26 Then
                ' 最終列が "(地)", "(外)", "(外)(地)" の場合、L 列にセルを挿入する
                Select Case 行.Cells(, 行.Count).Value
                Case "(地)", "(外)", "(外)(地)"
                    セル挿入 行
                End Select
            End If
        Next
    End Sub
    
    ' 指定行の L 列にセルを挿入する
    Sub セル挿入(挿入行 As Range)
        ' 行の使用領域が L 列まで行っていない場合は挿入しない
        If 挿入行.Count > 11 Then
            ' L 列にセルを挿入する
            挿入行.Range("l1").Insert xlShiftToRight
        End If
    End Sub


    • 編集済み infade 2019年9月18日 4:20 コードを微修正
    2019年9月18日 2:55
  • infade様

    早速の御連絡有難う御座います、大変申し訳ありませんが条件として

    1,列数が最大で27列、行数が最大で18で下記の条件の時に動作をさせたいのですが

    1、列数が26列より少なく又行数が最大で18行でその時に空白の列が存在しますL列に列を挿入。

    2、列数が26列より少なく又行数が最大で18行でその時に空白の列が存在します、又最終列に文字列"(外)"・"(外)(地)"・"(地)"のどれかが存在する時にL列に列を挿入

    infade様が記述頂いたロジックでは大変申し訳ありませんが動作いたしませんでした御手数をお掛けして申し訳ありませんが御教授を御願い致します。
    2019年9月19日 6:23
  • 動作しないというのはどういう状態ですか?

    1. エラーが出る → エラーメッセージなどの詳細を書いてください
    2. 期待通りの動作をしない → 動作結果と期待する結果の差異などを詳しく書いてください
    3. その他 → 詳細をお書きください

    そもそもから条件の内容がいまいちよくわからないのですが

    1、列数が26列より少なく又行数が最大で18行でその時に空白の列が存在しますL列に列を挿入。
    2、列数が26列より少なく又行数が最大で18行でその時に空白の列が存在します

    これは対象範囲内に 1 行 もしくは 1 列以上の空白の行 / 列があると
    いうことでしょうか。
    行単位もしくは列単位で空白セルが 1 つ存在するだけの場合は動作上、
    問題ないはずです。
    A1 セルを選択して Ctrl + A を押したときに選択される範囲が
    データのある範囲を完全にカバーしきれていないということで
    いいでしょうか。

    L列に列を挿入。

    又最終列に文字列"(外)"・"(外)(地)"・"(地)"のどれかが存在する時にL列に列を挿入

    L 列に挿入するというのはその行の L 列部分を挿入するのではなく、
    L 列全体を 1 列挿入するのでしょうか。
    そうするとほかの行にも影響 (ほかの行の列数も増えてしまう) が
    出てしまいますが。


    • 編集済み infade 2019年9月19日 17:20 誤入力を修正
    2019年9月19日 7:03
  • infade 様

     早速の御連絡有難う御座います、説明内容が分かりにく御迷惑をおかけしております。

    列数が最大で(27列:AA)でその列数には空白の列数が存在します、行数が最大で(18行)でその行数には空白の行数が存在します。

    1. 列数が26列より少ない時にはL列全体を挿入空白の列数が存在します。
    2. 列数が26列より少なく最終列に文字列"(外)"、"(外)(地)”、"(地)”が有る時にはL列全体を挿入空白の列が存在します。

    これは対象範囲内に 1 行 もしくは 1 列以上の空白の行 / 列があると
    いうことでしょうか。

    その通りです。

    A1 セルを選択して Ctrl + A を押したときに選択される範囲が
    データのある範囲を完全にカバーしきれていないということで
    いいでしょうか。

    その通りですShift+Ctrl+Endの時はDataのある範囲を完全にカバーします。

    L 列に挿入するというのはその行の L 列部分を挿入するのではなく、
    L 列全体を 1 列挿入するのでしょうか。

    その通りです。

    エラーが出る → エラーメッセージなどの詳細を書いてください

    エラーメッセージは出力されずに終了します。

    期待通りの動作をしない → 動作結果と期待する結果の差異などを詳しく書いてください

    列挿入がされずに変化無く終了します。

     御手数をお掛けして申し訳ありませんが御教授を御願い致します。

    2019年9月20日 20:00