• 締切済み

CSV形式でのエクセルなんですが

CSV形式でのエクセルなんですが 状況としては B列を商品名にしている。 エクスポートしたデータを貼り付け、それをほかのソフトに取り込むというような形です。 しかし、取り込むソフト側が商品名が全角20文字、半角40文字と決まっていることと、 エクスポートした時点では商品名がそれ以上の長さのものが多いため取り込めません。 そこで、字数制限などを設け 自動的に全角20文字、半角40文字以降は削除するというようなやり方はできないでしょうか?

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

対象となるシートに下記マクロを定義してください。 前提条件 (1)A列を全角20文字とする  A列中の半角は除去し、20文字以内に切り詰める (2)B列を半角40文字とする  B列中の全角は除去し、40文字以内に切り詰める Option Explicit Dim 中 As Boolean Private Sub Worksheet_Change(ByVal Target As Range) Dim 半, 全, 値 Dim 行 As Long, 列 As Long, 文 As String '処理中なら何もしない If 中 Then Exit Sub '列位置を求める 列 = Target.Column '1列目、2列目以外は何もしない If 列 <> 1 And 列 <> 2 Then Exit Sub '処理中にする 中 = True '行位置を求める 行 = Target.Row 'データ内容を取得する 値 = Target.Value '半角用の正規表現を設定する Set 半 = CreateObject("VBScript.RegExp") 半.Global = True 半.Pattern = "[\u0000-\u00FF\uFF61-\uFF9F]" '全角用の正規表現を設定する Set 全 = CreateObject("VBScript.RegExp") 全.Global = True 全.Pattern = "[^\u0000-\u00FF\uFF61-\uFF9F]" If IsArray(値) Then     '複数セルを処理している場合     Dim 横 As Long, 縦 As Long     '行方向のループ     For 縦 = 1 To UBound(値, 1)         '列方向のループ         For 横 = 1 To UBound(値, 2)             '行と列の位置を算出する             Dim X As Long, Y As Long             X = 列 + 横 - 1             Y = 行 + 縦 - 1             If X = 1 Then                 '1列目(全角側)の処理                 文 = 半.Replace(値(縦, 横), "")                 文 = Left(文, 20)                 Target.Worksheet.Cells(Y, X).Value = 文             ElseIf X = 2 Then                 '2列目(半角側)の処理                 文 = 全.Replace(値(縦, 横), "")                 文 = Left(文, 40)                 Target.Worksheet.Cells(Y, X).Value = 文             End If         Next     Next Else     '単一セルの処理     If 列 = 1 Then         '1列目(全角側)の処理         文 = 半.Replace(値, "")         文 = Left(文, 20)     Else      '2列目(半角側)の処理         文 = 全.Replace(値, "")         文 = Left(文, 40)     End If     Target.Value = 文 End If '処理中を解除する 中 = False End Sub 後、間違うといけないのですが、VBAの文字コードは 内部ではUniCodeなので、半角でも2バイトあります。 Lenbでは判定できませんので、注意してください。 (やるならKERNEL32にあるstrlenAを使う) 尚、マクロ登録前に記述してあるデータは処理できません。

回答No.3

相手先の仕様に合わせて項目の文字数を制限したデータを作ってお いて、それをcsvに吐き出すのが順当でしょう。「全角20文字、半角 40文字」ってのは要するにShift_JISで40バイトに違いないので、日 本語版Excelオリジナル関数のleftbで =leftb(B1,40) とするだけで トリミングできます。どこかの列か、もしかしたら別のシートで やって、そっちを吐き出して下さい。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

削除は、VBA使えばできます。 例えば、 どのタイミングで、どのセルで編集させるのが良いのでしょうか。 CSVファイルを編集する。(CSVファイルにて全角20文字状態。) セルB列へ取り込むとき編集する。(B列が全角20文字状態。) セルへ取り込んだ後C列へ編集する。(C列が全角20文字状態。) 別シートを追加してそこへ編集する。(別シートB列が全角20文字状態。)

  • violet430
  • ベストアンサー率36% (27472/75001)
回答No.1

自動削除は難しいと思いますが、マクロを作ったら一括削除はできると思いますよ 。

関連するQ&A

専門家に質問してみよう