Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
vbaのcellやrange以外の指定変数
投稿日時: 22/02/27 17:33:36
投稿者: こはく
メールを送信

こんにちは
vba勉強中なのですが、
cellsやrange以外にセルを指定するコードってあるんでしょうか?
今VBAをいじってるのですが、
 
   If strMode = CST_モード2 Then
        If (StrCsv(0) <> "企業コード") Or _
           (StrCsv(1) <> "支店コード") Or _
           (StrCsv(2) <> "店舗コード") Or _
           (StrCsv(3) <> "企業名") Or _
           (StrCsv(4) <> "支店名") Or _
           (StrCsv(5) <> "店舗名") Or _
           (StrCsv(6) <> "店舗郵便番号") Or _
           (StrCsv(7) <> "店舗住所") Or _
           (StrCsv(Cool <> "店舗電話番号") Then
            
           strRtnMsg = "NG"
        Else
            strRtnMsg = "OK"
        End If
 
ってところが全然わからなく・・・
あとで
 
 Dim strCell_1 As String
とか
 
strCell_1 = "A2"
 
 
というのも見受けられました。
 
もしかしたら、
 
StrCsv(0) <> "企業コード")
 
の指定って意味なのか、とか考えたのですが・・・
 
もしお分かりになる方いればよろしくお願いします。

回答
投稿日時: 22/02/27 17:47:58
投稿者: simple

まず、次回からOSとExcelのバージョンを明記するようにしてください。
(もし、選択肢になければ、本文に直接書いてください。)
 
質問の意味がちょっと分かりかねますが、
まずは、StrCsvというのが何かを説明してください。
それは理解されているんですか?
 
セルはRangeオブジェクトで管理します。
>strCell_1 = "A2"
はセルのアドレスを文字列変数に持っているわけですね。

Range(strCell_1)
とすることで、A2セルを表すRangeオブジェクトを表すことができます。
Range(strCell_1).Value = "abc"
といった使い方です。

投稿日時: 22/02/27 18:01:24
投稿者: こはく
メールを送信

なるほど、失礼しました。
ウインドウズはWindows10
エクセルは365になります。
 
StrCsvが何かっていうのもわかってないのですが、こちらのVBAは住所録csvを読み込ませて、宛名のラベルを作成できるようにしています。
企業コードなどはcsvファイルのA1の欄に書いてある言葉です。
そのままa,b,c//と続いていくので
 
その条件に当てはまれば
"企業コード") が (StrCsv(0)
ということになるのかなと思ったんですがそういうことではないようで・・・
 
strCell_1 = "A2"
 
というのはなんとなく理解できました。ありがとうございます。

回答
投稿日時: 22/02/27 18:04:42
投稿者: よろずや

StrCsv(0)
これは配列というものです。
CSVファイルの1行目を読み取ってコンマを区切りとして配列に入れたものです。
 
CSVファイルの1行目には、
"企業コード","支店コード","店舗コード","企業名","支店名","店舗名","店舗郵便番号","店舗住所","店舗電話番号"
と入っているはず。(ダブルクォーテーションは付いてないかも)
それを1行分丸々っと読み込んでそれを StrCsv(0) StrCsv(1) StrCsv(2) StrCsv(3) ...
に入れます。これを配列といいます。
 
1行目がこれと一致してない場合は、対象外のファイルなので以後の処理を中断する必要があるので、一致してるかどうかチェックしてるのです。

投稿日時: 22/02/27 18:15:36
投稿者: こはく
メールを送信

なるほど・・・
そういうことだったんですね。
 
実は、csvの仕様が変わって企業コードとか一番上の項目がすべて変わってしまいました。
 
なので、マクロの項目を
その項目に書き直せば、開けるようになるかと思ったのですが、
うまくいかなかったので、いろいろいじっています。
 
この項目以外にチェック項目はあるのでしょうか?
 
先ほどのは変更後のもので
変更前は
 
 
'&*************************************************************
'& CSVデータチェック処理
'&*************************************************************
Public Function ChkCSVデータ(ByVal strData As String, _
                             ByVal strMode As String) As String
 
    Dim StrCsv() As String
    Dim strRtnMsg As String
    Dim i As Long
 
    strRtnMsg = ""
    '-------------------------------------------------------
    ' カンマ区切りで配列に格納
    '-------------------------------------------------------
    strData = Replace(strData, """", "")
    StrCsv = Split(strData, ",")
    '-------------------------------------------------------
    ' 配列数チェック
    '-------------------------------------------------------
    i = UBound(StrCsv)
    If i <= 7 Then
        strRtnMsg = "NG"
        ChkCSVデータ = strRtnMsg
        Exit Function
    End If
    '-------------------------------------------------------
    ' ヘッダーチェック処理
    '-------------------------------------------------------
    If strMode = CST_モード2 Then
        If (StrCsv(0) <> "加盟店コード") Or _
           (StrCsv(1) <> "SSナンバー") Or _
           (StrCsv(2) <> "アクセスナンバー") Or _
           (StrCsv(3) <> "パスワード") Or _
           (StrCsv(4) <> "加盟店名") Or _
           (StrCsv(5) <> "SS名") Or _
           (StrCsv(6) <> "SS郵便番号") Or _
           (StrCsv(7) <> "SS住所") Or _
           (StrCsv(8) <> "SS電話番号") Then
            
           strRtnMsg = "NG"
        Else
            strRtnMsg = "OK"
        End If
    ElseIf strMode = CST_モード1 Then
        If (StrCsv(0) <> "顧客管理番号@") Or _
           (StrCsv(1) <> "姓名") Or _
           (StrCsv(2) <> "フリガナ(姓名)") Or _
           (StrCsv(3) <> "郵便番号") Or _
           (StrCsv(4) <> "住所1") Or _
           (StrCsv(5) <> "住所2") Or _
           (StrCsv(6) <> "電話番号1") Or _
           (StrCsv(7) <> "電話番号2") Then
            
           strRtnMsg = "NG"
        Else
            strRtnMsg = "OK"
        End If
    End If
    '-------------------------------------------------------
    ' 戻り値設定処理
    '-------------------------------------------------------
    ChkCSVデータ = strRtnMsg
 
End Function
 
このようになっていました。

回答
投稿日時: 22/02/27 18:55:01
投稿者: WinArrow
投稿者のウェブサイトに移動

何を問題としているのか?
よくわかりませんが、
 

引用:

    If i <= 7 Then
        strRtnMsg = "NG"
        ChkCSVデータ = strRtnMsg
        Exit Function
    End If

 
 
i <=7(7以下)だと
strModeが1の処理は実行されないとおみますが・・・
このIf条件は、大丈夫ですか?

投稿日時: 22/02/27 19:15:58
投稿者: こはく
メールを送信

これは、もともと使っていたcsvのデータなので、大丈夫だと思います。
新しい書式のcsvを開けるようになりたいと思っています。
項目欄を変更してみても開かなかったので、ほかにも何か原因があるのかなとは思うのですが。
 
あとは
先ほどの変数
 
   If i <= 7 Then
        strRtnMsg = "NG"
        ChkCSVデータ = strRtnMsg
        Exit Function
    End If
 
のところも疑問だったのですが、
 
vba上でiを使っている文章を探してみたのですがなくて、どういうことだろうと思っています。
見逃しているだけでしょうか?

回答
投稿日時: 22/02/27 19:58:23
投稿者: WinArrow
投稿者のウェブサイトに移動

こはく さんの引用:
これは、もともと使っていたcsvのデータなので、大丈夫だと思います。
新しい書式のcsvを開けるようになりたいと思っています。
項目欄を変更してみても開かなかったので、ほかにも何か原因があるのかなとは思うのですが。
 
あとは
先ほどの変数
 
   If i <= 7 Then
        strRtnMsg = "NG"
        ChkCSVデータ = strRtnMsg
        Exit Function
    End If
 
のところも疑問だったのですが、
 
vba上でiを使っている文章を探してみたのですがなくて、どういうことだろうと思っています。
見逃しているだけでしょうか?

 
見逃している/いない という問題ではありません。
i =7 は、項目数が8個ということです。
>If strMode = CST_モード2 Then は、StrCsv(0)〜sreCsv(8)をチェックしているあら、
i <= 7の条件には該当しませんよね。
しかし
>ElseIf strMode = CST_モード1 Then
は実行されないと思いますが・・・・
i<=7 は条件でEnd Funtion
に分岐してしまいますよね・・・・
 
 

回答
投稿日時: 22/02/27 21:01:13
投稿者: WinArrow
投稿者のウェブサイトに移動

項目数の件ですが、
strMode = CST_モード1

strMode = CST_モード2
で、項目数は同じですか?違いますか?
 
コードをみると、各々の項目数は
CST_モード2は、9
CST_モード1は、8
と思います。
StrCsv配列に格納した後、
項目数を8以下(i<=7)は、処理しないことにしていますが、
一緒でよいのでしょうか?
 

投稿日時: 22/02/27 21:14:02
投稿者: こはく
メールを送信

こちらはcsv出力するときの形式が2種類あり、それぞれ項目は違います。
 
モード1の時は17列(Q列)までのcsvが出ます。
モード2の場合はもっと多く正確な数字はすぐ出せないのですが、50以上の列になるかと思います。
 
ただ、このCSVの目的であるラベル作成で表示(作成)される項目は5個だけです。これはモード1も2も同じです。
 
ちゃんとお答えできてなかったらすみません。

回答
投稿日時: 22/02/27 21:51:51
投稿者: WinArrow
投稿者のウェブサイトに移動

こはく さんの引用:
こちらはcsv出力するときの形式が2種類あり、それぞれ項目は違います。
 
モード1の時は17列(Q列)までのcsvが出ます。
モード2の場合はもっと多く正確な数字はすぐ出せないのですが、50以上の列になるかと思います。
 
ただ、このCSVの目的であるラベル作成で表示(作成)される項目は5個だけです。これはモード1も2も同じです。
 
ちゃんとお答えできてなかったらすみません。

 
事情はわかりました。
それだったら、横目数のチェック(i<=7)は必要でしょうか?

投稿日時: 22/02/27 23:06:01
投稿者: こはく
メールを送信

正直わからないというしかないのはあります。
ほかの関数の場所を見て7個以下で、っていう項目はありませんでした。
 
ちょっと消して、どうなるか試してみたいと思います。

回答
投稿日時: 22/02/28 10:23:35
投稿者: R-

コード内の項目名を変更したら動きそうですが、動かない(おそらくNGになるという意味ですよね?)ということは列番号と項目名が一致していないのではないでしょうか。
 
これ以降はstrDataの中身が対象データの1行目という仮定で話します。
例えば「StrCsv(0) <> "企業コード"」であれば、対象データのA1に「企業コード」と記載されている必要があります。
「StrCsv(1) <> "支店コード"」であれば、対象データのB1に「支店コード」と記載されている必要があります。
 
もし支店コードがC列にあるならば、「StrCsv(2) <> "支店コード"」としなければなりません。

回答
投稿日時: 22/02/28 11:10:11
投稿者: QooApp

引用:
実は、csvの仕様が変わって企業コードとか一番上の項目がすべて変わってしまいました。
  
なので、マクロの項目を
その項目に書き直せば、開けるようになるかと思ったのですが、
うまくいかなかったので、いろいろいじっています。
  
この項目以外にチェック項目はあるのでしょうか?

 
うまくいかなかった、とのことですが、提示内容から想定できる失敗例は2通りあるのではないかと思います。
 
▼1.
プログラムを実行した時、なんらかのエラーメッセージが表示される。
→プログラムを開発した人が事前に想定して処理不可とした場合のエラーメッセージ
→プログラムがそもそも実行できないor実行中に開発者のエラーメッセージ以外のメッセージが表示される
 
▼2.
エラーメッセージは表示されないが、生成された結果のデータの並びがぐちゃぐちゃに入れ替わっている
 
どちらでしょうか。

回答
投稿日時: 22/02/28 11:21:25
投稿者: WinArrow
投稿者のウェブサイトに移動

1つの提案
 
Split関数は、配列の添え字は「0」から始まります。
セルの列は、1から始まるから、そのままだと整合しないので
扱う場面で頭を切り替える必要があります。
Split関数で取得した配列を簡単に変換する方法を提案します。
 
モジュールの先頭に
Option Base 1
を記述します。
 
以下、サンプルコードを書きます、
確認してみてください。
 
Sub test()
Dim data, i As Long
    data = Split("AAA,BBB,CCC", ",")
    ReDim Preserve data(1 To UBound(data) + 1)
End Sub
ローカルウィンドウで確認できます。

回答
投稿日時: 22/02/28 12:04:47
投稿者: Suzu

WinArrow さん
下限 0 から、 下限 1 への 変更の為に、ReDim Preserve は使うでしょうが
Split は Option Base の設定の影響を受けず 下限は必ず 0 だったのでは?
その例だと、Option Base 0|1 どちらでも 同じ 動作になりませんか。

投稿日時: 22/02/28 13:36:41
投稿者: こはく
メールを送信

R-さん
 
私もそう思って、コピペをし直してみたんですが、うまくいかなかったです。スペースとか余計なものは入っていないと思うのですが、上の列
StrCsv(1) <> "支店コード"
だったら、B1 が支店コードとなるように行いました。
 
QooAppさん
 
▼1.になります。
開発者が設定したエラーメッセージが流れております。
 
WinArrowさん
 
現在
StrCsv0がA1となっているのを
StrCsv1がA1となるようにするということでしょうか?
やってみます。
 
suzuさん
ご指摘ありがとうございます。
 
 
皆様お手伝いいただきありがとうございます。
 

回答
投稿日時: 22/02/28 13:53:35
投稿者: WinArrow
投稿者のウェブサイトに移動

suzuさんからのご指摘
 
Split関数は、添え字:0からの配列になります。
これは、OptionVase 1
を宣言したところで、何の効果もありません。
従って、Redim Preserve で、強制的に添え字:1からの配列に変更します。
 
サンプルコード

Sub test()
Dim StrD()
Dim data, i As Long

    ReDim StrD(0 To 2)
    StrD(0) = "AAA"
    StrD(1) = "BBB"
    StrD(2) = "CCC"

    data = Split(Join(StrD, ","), ",")
    Debug.Print "split 取得後"
    Debug.Print "Min Index : " & LBound(data)
    Debug.Print "Max Index : " & UBound(data)
    For i = LBound(data) To UBound(data)
        Debug.Print "   " & i & " : " & data(i)
    Next

    ReDim Preserve data(1 To UBound(data) + 1)
    Debug.Print "ReDim Preserve後"
    Debug.Print "Min Index : " & LBound(data)
    Debug.Print "Max Index : " & UBound(data)
    For i = LBound(data) To UBound(data)
        Debug.Print "   " & i & " : " & data(i)
    Next
    

End Sub

 
実行結果
引用:

split 取得後
Min Index : 0
Max Index : 2
   0 : AAA
   1 : BBB
   2 : CCC
ReDim Preserve後
Min Index : 1
Max Index : 3
   1 : AAA
   2 : BBB
   3 : CCC

 
なお、Option Base 1の宣言は、必要ありませんでした。

回答
投稿日時: 22/02/28 14:16:48
投稿者: R-

こはくさん
 
strDataの実際の値を見せていただけますか?
あとうまくいかないというのは、戻り値がNGになるという理解で間違いないですか?

回答
投稿日時: 22/02/28 14:23:51
投稿者: mattuwan44

>なので、マクロの項目をその項目に書き直せば
 

Option Explicit

'&*************************************************************
'& CSVデータチェック処理
'&*************************************************************
Public Function ChkCSVデータ2(ByVal strData As Variant, _
                             ByVal strMode As String) As String
    Const csMode1 As String = "顧客監理番号,姓名,住所,電話番号"
    Const csMode2 As String = "加盟店コード,SSナンバー,アクセスナンバー"
    Dim strTitle As String
    Dim i As Long
    
    '返り値に「NG」をセット
    ChkCSVデータ = "NG"
    
    'モードの違いで比較する文字を変える
    Select Case strMode
        Case "CST_モード1": strTitle = Split(csMode1, ",")
        Case "CST_モード2": strTitle = Split(csMode2, ",")
        Case Else: Exit Function    '指定の文字列出なければ抜ける
    End Select
    'カンマ区切りで配列に変更
    strData = Split(Replace(strData, """", ""), ",")
    '要素数が違ったら抜ける
    If UBound(strData) <> UBound(strTitle) Then Exit Function
    
    '要素を巡回してそれぞれが既定の文字列かチェック
    For i = LBound(strData) To UBound(strData)
        If strData(i) <> strTitle(i) Then Exit Function
    Next
    
    '全てが正しければ返り値に「OK」を返す。
    ChkCSVデータ = "OK"
End Function

 
    Const csMode1 As String = "顧客監理番号,姓名,住所,電話番号"
    Const csMode2 As String = "加盟店コード,SSナンバー,アクセスナンバー"
↑ここの文字をカンマ区切りで変更すればよいように書き直しました。
こんな感じになるかと、、、、

回答
投稿日時: 22/02/28 14:29:01
投稿者: mattuwan44

あ、追記
 
変数にどんな値が入っているか確認するには、
ローカルウィンドウで確認します。
 
ステップ実行をしながら、どのタイミングでどの変数にどんな値が入っているか確認してみてください。
http://www.ken3.org/vba/excel-help.html
 
配列変数は変数名の頭の「+」をクリックで中身が展開されます。

投稿日時: 22/02/28 16:23:24
投稿者: こはく
メールを送信

Rさん
strDataの実際の値がすみません、わからなかったのですがこちらでよろしいでしょうか?
 
 
 2×6タイプ データ設定 実行処理
'$********************************************************************************
Public Sub Set2_6タイプデータ設定処理(ByVal strCsvMode As String)
 
    Dim vntFileName As Variant
    Dim intSheetIdx As Long
    Dim intSheetIdxCount As Long
     
    Dim csvFile As String
    Dim ch As Long
    Dim i As Long
    Dim csvStr As String
    Dim StrCsv() As String
 
    '===========================================================
    ' ファイルを選択ダイアログオープン処理
    '===========================================================
    vntFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv" _
                                            , FilterIndex:=1 _
                                            , Title:="データプールファイル" _
                                            , MultiSelect:=False _
                                              )
    '===========================================================
    ' 選択ファイルオープン処理
    '===========================================================
    If vntFileName = False Then
       Exit Sub
    End If
    '===========================================================
    ' 新規ブック作成処理
    '===========================================================
    Dim NewBook As Workbook
    Dim strWkBookName As String
    '-----------------------------------------------------------
    '新しいブック作成 名前取得処理
    '-----------------------------------------------------------
    Set NewBook = Workbooks.Add
    strWkBookName = NewBook.Name
    '===========================================================
    'CSVファイル名
    '===========================================================
    csvFile = vntFileName
    '===========================================================
    '空いている番号を取得
    '===========================================================
    ch = FreeFile
    '===========================================================
    ' CSVファイルオープン
    '===========================================================
    Open csvFile For Input As #ch
    '===========================================================
    'インデックスリセット
    '===========================================================
    i = 1
    intSheetIdx = 1
    intSheetIdxCount = 1
    '===========================================================
    'CSVファイル読込
    '===========================================================
    Do While Not EOF(1)
        '-------------------------------------------------------
        '1行読込処理
        '-------------------------------------------------------
        Line Input #ch, csvStr
        '-------------------------------------------------------
        'カンマ区切りで配列に格納
        '-------------------------------------------------------
        csvStr = Replace(csvStr, """", "")
        csvStr = Replace(csvStr, "'", "")
        '=======================================================
        'CSVファイルチェック
        '=======================================================
        If i = 1 Then
            If ChkCSVデータ(csvStr, strCsvMode) = "NG" Then
                Close #ch
                Application.DisplayAlerts = False
                Workbooks(strWkBookName).Close
                Application.DisplayAlerts = True
                MsgBox "選択したファイルはデータプールCSVではありません。", vbOKOnly + vbExclamation
                Exit Sub
            End If
        Else
            '-----------------------------------------------------------
            'シート コピー処理
            '-----------------------------------------------------------
            If intSheetIdxCount = 1 Then
                ThisWorkbook.Worksheets("2×6タイプ").Copy Before:=Worksheets("Sheet1")
                Workbooks(strWkBookName).Worksheets("2×6タイプ").Name = CStr(intSheetIdx)
 
            End If
            '=======================================================
            '書き込み処理
            '=======================================================
            Set2_6セルデータ strCsvMode, csvStr, strWkBookName, i, intSheetIdx, intSheetIdxCount
            '-------------------------------------------------------
            ' シートインデックス処理 125
            '-------------------------------------------------------
            If intSheetIdxCount >= 12 Then
                'シートカウント
                intSheetIdx = intSheetIdx + 1
                '行カウント
                intSheetIdxCount = 1
                'シート数125で終了(1,500行分)
                If intSheetIdx > 125 Then
                    MsgBox "1,500行を超えました。以降は別途作成してください。", vbOKOnly + vbInformation
                    Exit Do
                End If
            Else
                '行カウント
                intSheetIdxCount = intSheetIdxCount + 1
            End If
  
        End If
        '-------------------------------------------------------
        'インクリメント
        '-------------------------------------------------------
        i = i + 1
    Loop
    '-----------------------------------------------------------
    'ファイルクローズ
    '-----------------------------------------------------------
    Close #ch
    '-----------------------------------------------------------
    '終了メッセージ
    '-----------------------------------------------------------
    MsgBox "作成完了"
 
End Sub

回答
投稿日時: 22/02/28 16:30:34
投稿者: R-

こはくさん
 
ソースを見るとやはりCsvの1行目がstrDataになりますので、
Csvの1行目をコピペしていただけると原因がわかるかと思います。
コピペは通常通りにCsvの1行目を全選択→コピー→ここにペースト、で大丈夫です。
 
エラーが出ているモードはどちらでしょうか。
そのモードのデータだけで構いません。

投稿日時: 22/02/28 17:30:13
投稿者: こはく
メールを送信

こんにちは
 
モード2になります。
 
一列目は125項目ありますので、さすがに多すぎるかなと思ったのですが大丈夫でしょうか?
とりあえず最初の何個か抜粋します
 
加盟店コード    SSナンバー    アクセスナンバー    パスワード    加盟店名    SS名    SS郵便番号    SS住所    SS電話番号    顧客管理番号@    顧客管理番号A1    顧客管理番号A2
 
 
このようになっております。

回答
投稿日時: 22/02/28 17:38:02
投稿者: QooApp

引用:
一列目は125項目ありますので、さすがに多すぎるかなと思ったのですが大丈夫でしょうか?
とりあえず最初の何個か抜粋します
  
加盟店コード SSナンバー アクセスナンバー パスワード 加盟店名 SS名 SS郵便番号 SS住所 SS電話番号 顧客管理番号@ 顧客管理番号A1 顧客管理番号A2

 
このヘッダーリストってCSVファイルをメモ帳で開いて表示した時のテキストですか?
エクセルで開いた時のセルのリストをコピペで貼ってますか?
 
前者の場合、カンマ区切りができなくて列ごとの区切りが失敗してそうです。

投稿日時: 22/02/28 18:02:24
投稿者: こはく
メールを送信

こんにちは、お疲れ様です。
こちらはエクセルの項目をセルごとコピペしたものになります。

回答
投稿日時: 22/02/28 18:18:56
投稿者: QooApp

でしたら杞憂です。申し訳ございません。
エラーメッセージで「NG」となるということは
NGになる条件式の箇所で処理が失敗しているのは事実と思うのでゴリ押しで処理の中を確認してほしいです。
下記の赤字箇所のテキストをご自身のプログラムに張り付けて実行してください。
 
2.プログラムを実行してください
3.エラーメッセージが表示されて終了すると思いますが、そのあとソースコード画面を表示してください
4.イミディエイトウィンドウという窓がプログラムテキストの編集画面以外にあるとおもいます。
▼なかったら下記操作いずれかで表示されます
>>>メニューの [ 表示 ] ボタン ⇒ [ イミディエイトウィンドウ ] を選択
>>>ショートカット [ Ctrl ] + [ G ] ボタン
 
5.イミディエイトウィンドウに表示されたテキストをそのままコピペでこちらの板に返信してください
 
'&*************************************************************
'& CSVデータチェック処理
'&*************************************************************
Public Function ChkCSVデータ(ByVal strData As String, _
                             ByVal strMode As String) As String
  
    Dim StrCsv() As String
    Dim strRtnMsg As String
    Dim i As Long
  
    strRtnMsg = ""
    '-------------------------------------------------------
    ' カンマ区切りで配列に格納
    '-------------------------------------------------------
    strData = Replace(strData, """", "")
    StrCsv = Split(strData, ",")

    Debug.Print StrCsv(0)
    Debug.Print StrCsv(1)
    Debug.Print StrCsv(2)
    Debug.Print StrCsv(3)
    Debug.Print StrCsv(4)
    Debug.Print StrCsv(5)
    Debug.Print StrCsv(6)
    Debug.Print StrCsv(7)
    Debug.Print StrCsv(8)
    Debug.Print UBound(StrCsv)

    '-------------------------------------------------------
    ' 配列数チェック
    '-------------------------------------------------------
    i = UBound(StrCsv)
    If i <= 7 Then
        strRtnMsg = "NG"
        ChkCSVデータ = strRtnMsg
        Exit Function
    End If
    '-------------------------------------------------------
    ' ヘッダーチェック処理
    '-------------------------------------------------------
 
 
    If strMode = CST_モード2 Then
        If (StrCsv(0) <> "加盟店コード") Or _
           (StrCsv(1) <> "SSナンバー") Or _
           (StrCsv(2) <> "アクセスナンバー") Or _
           (StrCsv(3) <> "パスワード") Or _
           (StrCsv(4) <> "加盟店名") Or _
           (StrCsv(5) <> "SS名") Or _
           (StrCsv(6) <> "SS郵便番号") Or _
           (StrCsv(7) <> "SS住所") Or _
           (StrCsv(8) <> "SS電話番号") Then
             
           strRtnMsg = "NG"
        Else
            strRtnMsg = "OK"
        End If
    ElseIf strMode = CST_モード1 Then

回答
投稿日時: 22/02/28 20:46:43
投稿者: WinArrow
投稿者のウェブサイトに移動

"NG"
になる現象を解析する方法
 
 @ strData = Replace(strData, """", "")
 A StrCsv = Split(strData, ",")
 
まず、@実行前のstrDataの内容を詳細にチェックする
  1番目のカンマ〜8個めカンマまで
 

回答
投稿日時: 22/02/28 21:33:20
投稿者: WinArrow
投稿者のウェブサイトに移動

提案

引用:

        If (StrCsv(0) <> "加盟店コード") Or _
           (StrCsv(1) <> "SSナンバー") Or _
           (StrCsv(2) <> "アクセスナンバー") Or _
           (StrCsv(3) <> "パスワード") Or _
           (StrCsv(4) <> "加盟店名") Or _
           (StrCsv(5) <> "SS名") Or _
           (StrCsv(6) <> "SS郵便番号") Or _
           (StrCsv(7) <> "SS住所") Or _
           (StrCsv(8) <> "SS電話番号") Then
              
           strRtnMsg = "NG"
        Else
            strRtnMsg = "OK"
        End If

 
この部分をメンテナンスを考慮した方法に変更しよう・・・・
 
項目名を定義したシートを用意します。
仮にA1〜A9セルに
項目名を入力します。上記の右辺に記述した名称です。
そして、そのセル範囲の「項目2」という名前を定義します。
 
セルの値を1次元のの配列に格納するコード(Index=0〜8)
 
Dim Value, Cx As Long

    Value = Range("項目2").Value               '2次元配列に入る
    Value = WorksheetFunction.Transpose(Value) '1次元配列に変換(1〜9)
    ReDim Preserve Value(0 To UBound(Vaue) - 1) '1次元配列に変換(0〜8)'

 
上記 if文を変更する
 
引用:
strRtnMsg = "OK"
    For Cx = LBound(Value) To UBound(Value)
        If strCSV(Cx) <> Value(Cx) Then
            strRtnMsg = "NG"
            Exit For
        End If
    Next

 
今後、項目名の順番、名前、個数の変更があったら、シートをメンテナンスするだけで対応可能。

投稿日時: 22/03/01 08:56:24
投稿者: こはく
メールを送信

皆様ありがとうございます。
ちょっと処理が追い付いていないので、皆様のアドバイス参考にさせていただいて、再度ここに書き込ませていただきます。

投稿日時: 22/03/02 08:59:23
投稿者: こはく
メールを送信

皆様お世話になっております。
 
アドバイスをもとに一歩前進しました。
 
csvデータの項目を確認していたのですが、まさかの項目の前に半角スペースがありました汗
マクロにこれを組み込むことによって、csvの読み込みはできるようになりました。ありがとうございます。
ただラベル作成のためのセルは空白で上がってしまったので、
次は、そこを直したいと思います。
 
もう少しお付き合いいただければ幸いです。

回答
投稿日時: 22/03/02 11:50:48
投稿者: QooApp

入力処理がうまくできるようになって良かったです。
 

引用:
ただラベル作成のためのセルは空白で上がってしまったので、
次は、そこを直したいと思います。

 
すみませんが空白で上がるとはどのような現象を説明していますか?
・自動入力される予定のセルに値が入力されたとき、枠と字間が詰まってしまうことを指してますか?
・入力予定のセルが変更(移動または削除)になったことを指しますか?
・参照する列情報が変更になって転記先のセルに入力されている値が入れ替わったことを指しますか?
 
もし助けが必要なら十分な説明をお願いします。

投稿日時: 22/03/02 11:57:35
投稿者: こはく
メールを送信

説明不足済みません。
 
ただラベル作成のためのセルは空白で上がったということは、
特に新しくラベルのシートを出すことなく、終了してしまった状況です。
読み込み完了と出るようになりました

作業はなにもされない
といった形です。
 
今まで使用していたものは、お客様のデータを抜き出して、新しいシートでお客様のデータを吸い上げて、
ラベルを作成しておりました。
 
しかし今回は、新しいシートが読み込まない、シートの元データにお客様情報が転記されない
状況になります。
・自動入力される予定のセルに値が入力されたとき、枠と字間が詰まってしまうことを指してますか?
セル情報が入力されてないので、枠文字が詰まってるということは確認できません。
 
 
・入力予定のセルが変更(移動または削除)になったことを指しますか?
csvは読み込めますが特に変更はなさそうです
 
・参照する列情報が変更になって転記先のセルに入力されている値が入れ替わったことを指しますか?
列変更はありませんでした。
 
 
となります。
 
 

投稿日時: 22/03/02 11:59:19
投稿者: こはく
メールを送信

多分書き出しのコードはここだと思うのですが転記しておきます。
 
'$********************************************************************************
'$ 2×6タイプ セルにデータ設定 実行処理
'$********************************************************************************
Public Sub Set2_6セルデータ(ByVal strCsvMode As String, _
                            ByVal StrCsvData As String, _
                            ByVal strWkBookName As String, _
                            ByVal intRow As Long, _
                            ByVal intSheetIdx As Long, _
                            ByVal intSheetIdxCount As Long)
 
    Dim StrCsv() As String
    Dim strYubin As String
    Dim strSheetName As String
     
    Dim strCell_1 As String
    Dim strCell_2 As String
    Dim strCell_3 As String
    Dim strCell_4 As String
    Dim strCell_5 As String
     
    '-----------------------------------------------------------
    '配列格納
    '-----------------------------------------------------------
    StrCsv = Split(StrCsvData, ",")
    '-----------------------------------------------------------
    '郵便番号変換
    '-----------------------------------------------------------
    strYubin = Chg郵便番号(strCsvMode, StrCsvData)
    '-----------------------------------------------------------
    'シート名作成処理
    '-----------------------------------------------------------
    strSheetName = CStr(intSheetIdx)
    '-----------------------------------------------------------
    'ラベル位置 設定処理
    '-----------------------------------------------------------
    Select Case intSheetIdxCount
        Case 1
            strCell_1 = "A2"
            strCell_2 = "A4"
            strCell_3 = "A5"
            strCell_4 = "A6"
            strCell_5 = "A7"
        Case 2
            strCell_1 = "C2"
            strCell_2 = "C4"
            strCell_3 = "C5"
            strCell_4 = "C6"
            strCell_5 = "C7"
        Case 3
            strCell_1 = "A10"
            strCell_2 = "A12"
            strCell_3 = "A13"
            strCell_4 = "A14"
            strCell_5 = "A15"
        Case 4
            strCell_1 = "C10"
            strCell_2 = "C12"
            strCell_3 = "C13"
            strCell_4 = "C14"
            strCell_5 = "C15"
        Case 5
            strCell_1 = "A18"
            strCell_2 = "A20"
            strCell_3 = "A21"
            strCell_4 = "A22"
            strCell_5 = "A23"
        Case 6
            strCell_1 = "C18"
            strCell_2 = "C20"
            strCell_3 = "C21"
            strCell_4 = "C22"
            strCell_5 = "C23"
        Case 7
            strCell_1 = "A26"
            strCell_2 = "A28"
            strCell_3 = "A29"
            strCell_4 = "A30"
            strCell_5 = "A31"
        Case 8
            strCell_1 = "C26"
            strCell_2 = "C28"
            strCell_3 = "C29"
            strCell_4 = "C30"
            strCell_5 = "C31"
        Case 9
            strCell_1 = "A34"
            strCell_2 = "A36"
            strCell_3 = "A37"
            strCell_4 = "A38"
            strCell_5 = "A39"
        Case 10
            strCell_1 = "C34"
            strCell_2 = "C36"
            strCell_3 = "C37"
            strCell_4 = "C38"
            strCell_5 = "C39"
        Case 11
            strCell_1 = "A42"
            strCell_2 = "A44"
            strCell_3 = "A45"
            strCell_4 = "A46"
            strCell_5 = "A47"
        Case 12
            strCell_1 = "C42"
            strCell_2 = "C44"
            strCell_3 = "C45"
            strCell_4 = "C46"
            strCell_5 = "C47"
    End Select
    '-----------------------------------------------------------
    'セル設定処理
    '-----------------------------------------------------------
    'DMデータ
    '-----------------------------------------------------------
    If strCsvMode = CST_モード1 Then
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_1).Value = "〒 " & strYubin
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_2).Value = StrCsv(4)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_3).Value = StrCsv(5)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_4).Value = ""
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_5).Value = StrCsv(1) & " 様"
    End If
    '-----------------------------------------------------------
    '通常CSVデータ
    '-----------------------------------------------------------
    If strCsvMode = CST_モード2 Then
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_1).Value = "〒 " & strYubin
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_2).Value = StrCsv(24)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_3).Value = StrCsv(25)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_4).Value = StrCsv(26)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_5).Value = StrCsv(13) & " 様"
    End If
 
End Sub

回答
投稿日時: 22/03/02 13:27:18
投稿者: WinArrow
投稿者のウェブサイトに移動

WORDの差込印刷で対応したほうがよいのでは?
という感想です。
 
 
 

回答
投稿日時: 22/03/02 14:42:43
投稿者: WinArrow
投稿者のウェブサイトに移動

Wordの差込データをExcelで作成するならば、
1件1行で編集することが可能です。
 
項目名を判断して、セル位置を決め、そこにデータを転記する
といった、ワープロ文書編集処理をExcelVBAでは、メンテナンスが大変だと感じます。
 
差込印刷の機能を使うと
フィールドに項目名をリンクさせますが、項目名の列位置は、自由です。
 
検討してみる価値はあると思います。
 

回答
投稿日時: 22/03/02 16:07:21
投稿者: R-

シートの作成すらされていないという事であれば、まずはこの箇所を確認しましょう。
 

引用:
'シート コピー処理
            '-----------------------------------------------------------
            If intSheetIdxCount = 1 Then
                ThisWorkbook.Worksheets("2×6タイプ").Copy Before:=Worksheets("Sheet1")
                Workbooks(strWkBookName).Worksheets("2×6タイプ").Name = CStr(intSheetIdx)
  
            End If

 
 
もしOnError系のコードが記載されているなら、一旦コメントアウトして実行すれば問題の箇所が分かるかと思います。
現状情報不足で的確にここがおかしいというのは言えません。。

回答
投稿日時: 22/03/02 20:27:04
投稿者: WinArrow
投稿者のウェブサイトに移動

>多分書き出しのコードはここだと思うのですが転記しておきます。
>多分
って、どういうこと?
このコードは、
>実は、csvの仕様が変わって企業コードとか一番上の項目がすべて変わってしまいました
の前のコードということですか?
もし、
掲示のコードが仕様変更前だとしたら、
回答者には、どのようにするのかを判断することは無理でしょう。

回答
投稿日時: 22/03/02 21:09:05
投稿者: eden

仲間の方が一歩先にあちらで質問しています。
https://www.239-programing.com/cgi-bin/excelvba_bbs.cgi?id=580
状況を確認してみてはいかがでしょうか。

回答
投稿日時: 22/03/02 21:58:55
投稿者: WinArrow
投稿者のウェブサイトに移動

立て続けのレスになりますが、
 
最初に申し上げておきますが、
この掲示板は、コードの作成依頼は禁止されています。
説明の中には、コード作成依頼とは表現されているわけではないが、
それ以前の問題(情報不足)があります。
 
提案に対しての回答も無し。
 
この辺で、回答者の立場を脱退します。
 
 

投稿日時: 22/03/08 09:00:40
投稿者: こはく
メールを送信

ご無沙汰しております。
皆様のご協力により、シートは開けるようになりました。ありがとうございます。
あと一点だけで終わると思いますのでご教授いただければ幸いです。
現在、あてはめようとしたセルの値が

2548
ではなく
=”2548”
という風になっております。
 
これが原因で開けないシートになっているようです。
これをシートに適応させる方法はありますでしょうか?

回答
投稿日時: 22/03/08 11:42:38
投稿者: Suzu

何が 問題 なのでしょうか。
 
セルに 数式が入っている事?
数式に、スペースが含まれている事?
 
シートを開く事と、セルの 数式との関連性が不明確です。
 
 
シートを開く が ブックを開く と読み替えたとして、
セルの 値 を元に、開くブック を決めていると言うことでしょうか?
そのセルに値に、スペースが含まれているから、ブック名と一致しない と言うことでしょうか?
 
そういう事であれば、前後のスペースを取り除くには、TRIM関数を使えば良いです。
  Trim(Range("A1").Value)
 
 
そういう事で無いなら、現状と希望を 判る様に ご説明ください。

回答
投稿日時: 22/03/08 14:08:04
投稿者: WinArrow
投稿者のウェブサイトに移動

何人もの回答者から
説明不足
という指摘があります。
読んでいないのかな???
 
回答者には、あなたのPCの画面は見えません。
文章にすることは難しいかもしれませんが、
文章で見えるように書いて下さい。
 
このままでは、誰も回答しなくなってしまいますよ。

投稿日時: 22/03/08 14:37:35
投稿者: こはく
メールを送信

Suzu さんの引用:
何が 問題 なのでしょうか。
 
セルに 数式が入っている事?
数式に、スペースが含まれている事?
 
シートを開く事と、セルの 数式との関連性が不明確です。
 
 
シートを開く が ブックを開く と読み替えたとして、
セルの 値 を元に、開くブック を決めていると言うことでしょうか?
そのセルに値に、スペースが含まれているから、ブック名と一致しない と言うことでしょうか?
 
そういう事であれば、前後のスペースを取り除くには、TRIM関数を使えば良いです。
  Trim(Range("A1").Value)
 
 
そういう事で無いなら、現状と希望を 判る様に ご説明ください。

 
説明不足申し訳ございません。
バージョンが何度か変わっており、
数式が入っているcsvと
入っていないCSVがあります。
 
現在は数式が入っているcsvです。
 
前回までの助言で、
数式が入っていない、旧式のCSVなら
このマクロのデータで
旧式CSVを読み込み、
新しいシートで、
宛名用のラベルを発行することができるようになりました。
 
しかし、新しい数式入りのcsvを
読み込ませたところ、
読み込みはされるのですが、
新しいシートが出てくることなく、
新しいbook1(何も記入されていないまっさらなシート)
が出てきて、
読み込み完了
というボックスが出てきて、
作業が終了してしまいます。
 
このため、
数式が新しいcsvに入っているから、読み込むことができないのではないかと
考えました。
0から始まる表示が消えないように
数式形式
=""
でくくって、
表示されるようになっております。
 
そのくくってある文章が、ラベル作成に必要になります。
 
現状
 
  '通常CSVデータ
    '-----------------------------------------------------------
    If strCsvMode = CST_モード2 Then
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_1).Value = StrCsv(21)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_2).Value = StrCsv(22)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_3).Value = StrCsv(23)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_4).Value = StrCsv(24)
        Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_5).Value = StrCsv(11) & " 様"
    End If
 
というコードで
各セルを呼び出しております。
このセルの中が数字のみ123456などだったら、セルの読み込みが問題なくできております。
 
しかし現状は
="123456"
となっており、
読み込みができなくなっております。
 
こちらの値だけを書き込みする方法があればと思いお伺いさせていただきました。
 
 
 
 
 
 

回答
投稿日時: 22/03/08 15:26:49
投稿者: WinArrow
投稿者のウェブサイトに移動

数式を文字列でCSVデータとする方法
 
>小手先
のような対応ではなく、列を「文字列」に設定しておけば、
前ゼロでセルに格納できます。
数式のCSVなんてやめたら・・・

投稿日時: 22/03/08 15:32:12
投稿者: こはく
メールを送信

WinArrow さんの引用:
数式を文字列でCSVデータとする方法
 
>小手先
のような対応ではなく、列を「文字列」に設定しておけば、
前ゼロでセルに格納できます。
数式のCSVなんてやめたら・・・

 
そうですよね・・・
皆様代替え案を出していただけて、
ありがたいです。
ですが、そこらへんシステム担当にお願いしなければならなく、
まだ僕の発言力では・・・指摘することができません。
すみません、ありがとうございます。

回答
投稿日時: 22/03/08 15:56:48
投稿者: QooApp

引用:
ですが、そこらへんシステム担当にお願いしなければならなく、
まだ僕の発言力では・・・指摘することができません。

 
たとえ新人で右も左もわからないとしてもですが、業務で使用するレベルのものであれば私たちの細々した指摘だけで完全体を建造することはできないと思ってください。
 
後から〇〇の箇所でエラーになるとかが発生したとして、それが原因で損害賠償に発展したと仮定します。
私たちがその賠償をすると思いますか?
 
内容を見るに、伝票自動印字でしょうし失敗を連発したとして紙代程度でしょうから微々たるものですが
機能の改修に伴う責任問題をここの回答者が負うことはありません。
 
システム担当に直接頼むのはおそらくですが普通の業務体系としては間違っていると思われます。
自分の上司に相談>上司から上司・・・・>システム担当へ改修指示となるはずです。
 
部署をまたいで勝手に指示を出すとそれこそ上司から詰められると思います。
システム担当に上司経由でちゃんと相談し、機能の改修が明確に完了したことを確認して作業で使用するようにしないと「ネットのコピペで動いてるけどよくわからない」まま運用して多額の賠償になることもあります。
 
システム担当に頼まなくても外注を探してみるのも大事です。
お金の契約をしている以上、開発側も金額と契約に伴う不具合の対処は(仕様を最初にはっきりさせていれば)基本的に義務と考えていただいて大丈夫だと思います。(中には不具合は別途契約とあることもありますが)
 
問題をここで提示してくれるのは構いませんが、規約にもあるように開発を依頼するに等しい行為は禁止行為ですし、ここのサイトでできたデータで賠償責任になっても「社内の情報をネットに勝手に掲載した情報漏洩」「動作の正確性の保証をせずに運用した」としてどっちに転がっても良いことは無いと思います。
 
また、議題初期に仰っていられたCSV取り込みフォーマットが変更になったとありますが、ここまで動作面に悪影響のある(改修が必須の項目が多い)プログラムの修正作業であれば、ゼロから新規にプログラム作り直す方が良いと思います。
 
もちろん「ここを修正して、影響範囲のここを修正したら動く」と正しい認識があれば改修もできますが…。

回答
投稿日時: 22/03/08 16:02:35
投稿者: Suzu

引用:
読み込ませたところ、
読み込みはされるのですが、
新しいシートが出てくることなく、

読み込み完了
というボックスが出てきて、
作業が終了してしまいます。
  
このため、
数式が新しいcsvに入っているから、読み込むことができないのではないかと

 
「読み込みはされる」 のに、「読み込むことができない」?
用語 は 統一性をもって使ってください。
 
いちいち 推測するのは疲れます。
 
 
引用:
このセルの中が数字のみ123456などだったら、セルの読み込みが問題なくできております。
  
しかし現状は
="123456"
となっており、
読み込みができなくなっております。

 
【どこ】が 『123456』または『="123456"』 なのか 明記してください。
StrCsv(21) 等、配列内 の 値 を指している で間違いありませんか?
 
 
ご説明の内容から推測するに
 
読み込み完了 と 表示されるが、新しいシートが作成されない。
なので、読み込むことができておらず、それは、CSVに "=" が入っており
 
 Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_1).Value = StrCsv(21)

が原因と思われるのでどうにかしたい。
 
と。。。
 
 
その通り。
Value プロパティー には、『文字』や『数値』の値は渡せますが、「=」で始まる 数式 は 渡せません。
数式を渡すためには、Formula系 のプロパティーに 渡す必要があります。
 
 
そもそも、"="を含めた CSV ファイルなんて、普通は作らないです。
CSV 側の、数値先頭の 「0」をExcelが消してしまう事への対処でしょうが
 
0を消すのは、Excelの余計なお節介ではありますが、「=」を入れ込と言うことは
Excel 前提 CSV を で作っていますよね。
 
今回の取り込み側の セル書式を、『文字列』とすれば済む話を、
出力ロジック側で、操作するのでしょう。
 
元々、「=」 を入れないで セルの書式設定で 対処すれば、今回のコードの見直しだけで済みます。
 
「=」なし
 ・CSV の出力側 では 特に変更なし
 ・CSV の受け手側 での セル書式を設定するロジックの追加
 
だったのに
「=」を 入れると
 ・CSV の出力側 での 余計なロジック変更 が必要
 ・CSV の受け手側 での Formula へのロジック変更が必要
     → スペースが入っている事での、ロジック変更も必要

投稿日時: 22/03/08 16:38:32
投稿者: こはく
メールを送信

QooApp さんの引用:
引用:
ですが、そこらへんシステム担当にお願いしなければならなく、
まだ僕の発言力では・・・指摘することができません。

 
たとえ新人で右も左もわからないとしてもですが、業務で使用するレベルのものであれば私たちの細々した指摘だけで完全体を建造することはできないと思ってください。
 
後から〇〇の箇所でエラーになるとかが発生したとして、それが原因で損害賠償に発展したと仮定します。
私たちがその賠償をすると思いますか?
 
内容を見るに、伝票自動印字でしょうし失敗を連発したとして紙代程度でしょうから微々たるものですが
機能の改修に伴う責任問題をここの回答者が負うことはありません。
 
システム担当に直接頼むのはおそらくですが普通の業務体系としては間違っていると思われます。
自分の上司に相談>上司から上司・・・・>システム担当へ改修指示となるはずです。
 
部署をまたいで勝手に指示を出すとそれこそ上司から詰められると思います。
システム担当に上司経由でちゃんと相談し、機能の改修が明確に完了したことを確認して作業で使用するようにしないと「ネットのコピペで動いてるけどよくわからない」まま運用して多額の賠償になることもあります。
 
システム担当に頼まなくても外注を探してみるのも大事です。
お金の契約をしている以上、開発側も金額と契約に伴う不具合の対処は(仕様を最初にはっきりさせていれば)基本的に義務と考えていただいて大丈夫だと思います。(中には不具合は別途契約とあることもありますが)
 
問題をここで提示してくれるのは構いませんが、規約にもあるように開発を依頼するに等しい行為は禁止行為ですし、ここのサイトでできたデータで賠償責任になっても「社内の情報をネットに勝手に掲載した情報漏洩」「動作の正確性の保証をせずに運用した」としてどっちに転がっても良いことは無いと思います。
 
また、議題初期に仰っていられたCSV取り込みフォーマットが変更になったとありますが、ここまで動作面に悪影響のある(改修が必須の項目が多い)プログラムの修正作業であれば、ゼロから新規にプログラム作り直す方が良いと思います。
 
もちろん「ここを修正して、影響範囲のここを修正したら動く」と正しい認識があれば改修もできますが…。

 
 
お心遣い感謝いたします。
業務に対して、注意力も考え方もかけていたかと思います。
まだ勉強中の自分が手を出して正しく理解して、提供できるものか
は考えもしませんでした。
考え直したいと思います。
ご助力いただいた方々申し訳ございません。
ありがとうございます。

投稿日時: 22/03/08 16:46:40
投稿者: こはく
メールを送信

Suzu さんの引用:
引用:
読み込ませたところ、
読み込みはされるのですが、
新しいシートが出てくることなく、

読み込み完了
というボックスが出てきて、
作業が終了してしまいます。
  
このため、
数式が新しいcsvに入っているから、読み込むことができないのではないかと

 
「読み込みはされる」 のに、「読み込むことができない」?
用語 は 統一性をもって使ってください。
 
いちいち 推測するのは疲れます。
 
 
引用:
このセルの中が数字のみ123456などだったら、セルの読み込みが問題なくできております。
  
しかし現状は
="123456"
となっており、
読み込みができなくなっております。

 
【どこ】が 『123456』または『="123456"』 なのか 明記してください。
StrCsv(21) 等、配列内 の 値 を指している で間違いありませんか?
 
 
ご説明の内容から推測するに
 
読み込み完了 と 表示されるが、新しいシートが作成されない。
なので、読み込むことができておらず、それは、CSVに "=" が入っており
 
 Workbooks(strWkBookName).Sheets(strSheetName).Range(strCell_1).Value = StrCsv(21)

が原因と思われるのでどうにかしたい。
 
と。。。
 
 
その通り。
Value プロパティー には、『文字』や『数値』の値は渡せますが、「=」で始まる 数式 は 渡せません。
数式を渡すためには、Formula系 のプロパティーに 渡す必要があります。
 
 
そもそも、"="を含めた CSV ファイルなんて、普通は作らないです。
CSV 側の、数値先頭の 「0」をExcelが消してしまう事への対処でしょうが
 
0を消すのは、Excelの余計なお節介ではありますが、「=」を入れ込と言うことは
Excel 前提 CSV を で作っていますよね。
 
今回の取り込み側の セル書式を、『文字列』とすれば済む話を、
出力ロジック側で、操作するのでしょう。
 
元々、「=」 を入れないで セルの書式設定で 対処すれば、今回のコードの見直しだけで済みます。
 
「=」なし
 ・CSV の出力側 では 特に変更なし
 ・CSV の受け手側 での セル書式を設定するロジックの追加
 
だったのに
「=」を 入れると
 ・CSV の出力側 での 余計なロジック変更 が必要
 ・CSV の受け手側 での Formula へのロジック変更が必要
     → スペースが入っている事での、ロジック変更も必要

 
 
了解しました。
古いcsvは新しいシートが出てきて、読み込むことができた
新しいcsvは新しいシートが出てこないで、読み込むことができた(表示はされませんでした)
そのほかはおっしゃる通りの意味です。
説明不足、推測していただき申し訳ありません。
 
引用
そもそも、"="を含めた CSV ファイルなんて、普通は作らないです。
 
了解しました。
すみません、こちらにつきましては、対応方法を別で、(指摘箇所を文字列に変更など)考えたいと思います。
ご指摘ありがとうございます。

回答
投稿日時: 22/03/08 17:56:44
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
Value プロパティー には、『文字』や『数値』の値は渡せますが、「=」で始まる 数式 は 渡せません。
数式を渡すためには、Formula系 のプロパティーに 渡す必要があります。

 
  
「=」で始まる数式は、Valueプロパティには、渡せません・・・・
本当にそうですか?
  
以下、サンプルコードです。
問題なく実行できますが、どこか間違っていますか?
  
    Dim csvData
    csvData = Split("AAA,=01234,=""00123""", ",")
    Range("A1").Value = csvData(0)
    Range("A2").Value = csvData(1)
    Range("A3").Value = csvData(2)
    MsgBox csvData(2)

 
元データにも代があるのか?
Split関数実行前の編集に問題があるのか、確認しましょう。
 
私も、Formula派なので、Valueを使うことを勧めているわけではありません。

回答
投稿日時: 22/03/09 12:00:38
投稿者: Suzu

WinArrow さんの引用:
「=」で始まる数式は、Valueプロパティには、渡せません・・・・
本当にそうですか?
  
以下、サンプルコードです。
問題なく実行できますが、どこか間違っていますか?

 
!!そうだったのですね!!Value にも 数式を渡せるのですね!!
先頭に「=」が入っていると数式として認識し Formulaプロパティーにいるイメージですね。
 
ご指摘ありがとうございました。
 
 
P.S.
ついでに Value と Formula FormulaR1C1 の違いを試していると これまた発見が。。
正確には 『Value と Formula FormulaR1C1 の違い』には関係ないのですが・・
Range("A1").Value = 1
Range("B1").Value = "'1"
Range("C1").Value = "=""1"""
 
Range("A2:C2").Value = "=A1+5"
全部 6? え。。。 あっそうですか。。
 
IsNumeric (Valueプロパティ)= True となる セルに対し計算されるのは判っており
そこから、IsNumber関数で False の セルもエラーになると思い込んでいました。
 
新しい発見をありがとうございます。

投稿日時: 22/03/10 09:40:46
投稿者: こはく
メールを送信

皆様ありがとうございました。
なお、ちゃんと質問回答できなく、回答者様方を不快にしてしまって申し訳ございません。
結果はうまく開くことができませんでしたが、進展はありました。
大変勉強になりました。ありがとうございます。
シートの構成を見直してみるべき、別の方法もあるという意見が多数ありましたので、
見直しさせていただきます。
この度はありがとうございました。
これにて失礼させていただきます。