🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

5回答

1437閲覧

文字列が含まれるなら文字列、数値なら数値として値を持ってきたい

Naoko_Coco

総合スコア54

VBA

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

0グッド

0クリップ

投稿2019/09/11 08:41

編集2019/09/11 08:46

Excelを読込、文字列が含まれるならならそのままもってきて数値なら数値?半角英数字として持ってきたいです。
現状はすべて文字列になってしまいます。
コメントアウトしてるところはいろいろ試したけど、出来なかった痕跡です。。。

VBA

1Private Sub openPS(fp As String) 2 '職員マスタ 3 Dim i As Long 4 Dim r As Long 5 Dim c As Long 6 Dim iLine As Long 7 Dim wb As Workbook 8 Dim sh As Worksheet 9 Dim sData(9) As String 10 Dim Err As Long 11 12 Set wb = Workbooks.Open(Filename:=fp, ReadOnly:=True) 13 Set sh = wb.Worksheets(1) 14 iLine = 14 15 r = sh.Cells(sh.Rows.Count, 5).End(xlUp).Row 16 17 For i = 2 To r 18' If sh.Cells(i, 6) <> "" Then 19 sData(0) = CLng(sh.Cells(i, 5).Value) 20 sData(1) = sh.Cells(i, 6).Value 21 sData(2) = sh.Cells(i, 7).Value 22 sData(3) = sh.Cells(i, 8).Value 23 sData(4) = sh.Cells(i, 9).Value 24 sData(5) = sh.Cells(i, 12).Value 25 sData(6) = sh.Cells(i, 13).Value 26 sData(7) = sh.Cells(i, 14).Value 27 sData(8) = sh.Cells(i, 15).Value 28 sData(9) = sh.Cells(i, 17).Value 29' For c = 1 To Len(sData(0)) 30' If Mid(sData(0), c, 1) Like "[A-z]" Or Mid(sData(0), c, 1) Like "[0-9]" Then 31' Me.Cells(iLine, 3).Value = Me.Cells(iLine, 3) & StrConv(Mid(Trim$(sData(0)), c, 1), vbNarrow) 32' Else 33' Me.Cells(iLine, 3).Value = Me.Cells(iLine, 3) & Mid(Trim$(sData(0)), c, 1) '職員コード 34' End If 35' Next 36' sData(0) = CLng(sData(0)) 37 Me.Cells(iLine, 3).Value = Trim$(StrConv(sData(0), vbNarrow)) '職員コード 38 Me.Cells(iLine, 4).Value = Trim$(sData(1)) '漢字氏名 39 Me.Cells(iLine, 5).Value = Trim$(StrConv(sData(2), vbWide)) 'カナ 40 Me.Cells(iLine, 6).Value = Trim$(StrConv(sData(3), vbNarrow)) '性別 41 Me.Cells(iLine, 7).Value = Format(Trim$(sData(4)), "yyyymm") '入庫年月 42 Me.Cells(iLine, 8).Value = Trim$(StrConv(sData(5), vbNarrow)) '郵便番号 43 Me.Cells(iLine, 9).Value = Trim$(sData(6)) '住所1 44 Me.Cells(iLine, 10).Value = Trim$(sData(7)) '住所2 45 Me.Cells(iLine, 11).Value = Trim$(sData(8)) '住所3 46 Me.Cells(iLine, 12).Value = Trim$(sData(9)) '連絡欄 47 iLine = iLine + 1 48 49 50 Next 51 Me.Range("C13:L" & CStr(iLine - 1)).Borders.LineStyle = xlContinuous 52 wb.Close 53' r = Me.Cells(Me.Rows.Count, 3).End(xlUp).Row 54' For i = 14 To r 55' Me.Cells(iLine, 3) = CLng(Me.Cells(iLine, 3)) 56' Next 57 58 59 60 Call ErrCheck 61 62 63End Sub

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

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

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

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

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

guest

回答5

0

自己解決

質問がうまくまとまっていないので再度別個で質問します。

投稿2019/09/13 09:38

Naoko_Coco

総合スコア54

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

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

Zuishin

2019/09/13 10:28

解決方法が書かれていません。
guest

0

現状はすべて文字列になってしまいます。

えっと、
開くファイルはエクセルのファイルですよね?
で、文字列になっているというのは、
セルの書式設定が「文字列」になっていてセルの値に「文字列」るのか、
セルの書式設定が「標準」または「文字列」以外になっているが、
セルの値として「文字列」が入っているのか、どっちですか?

前者だとして、一括でセルの書式設定を「標準」に戻せれば、よいのですか?
2~3行のサンプルデータのびふぉー&あふたーがあれば、
なにかしら案を提示できるとおもいます。

投稿2019/09/12 01:09

mattuwan

総合スコア2163

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

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

0

>データは半角英数字を想定してます。
>それ以外を入れた場合にそのセルを赤くしてるんです。

入力可能な文字は、半角のAからZ、半角のaからz、半角の0から9のいずれかとします。これ以外はすべてエラーになります。(全角はエラー、小数点はエラー)

以下のようなチェック関数を作成します。
チェックしたいセルの内容を渡して、trueが返れば、半角の英数字であり、falseが返れば、先以外の文字があることになります。(空白文字列""はfalseが返ります)

vba

1Public Function IsAlphaNumeric(ByVal val As String) As Boolean 2 Dim RE As Object 3 Dim strPattern As String 4 Set RE = CreateObject("VBScript.RegExp") 5 RE.Pattern = "^[0-9A-Za-z]+$" 6 IsAlphaNumeric = RE.test(val) 7 Set RE = Nothing 8End Function 9

投稿2019/09/11 10:23

tatsu99

総合スコア5493

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

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

Naoko_Coco

2019/09/11 12:33

今日は帰宅してしまったので、明日試してみます! またご報告します。 いつもありがとう*(^o^)/*
guest

0

vba

1 Me.Cells(iLine, 3).Value = Trim$(StrConv(sData(0), vbNarrow)) '職員コード

この部分のことですよね。
他の氏名、カナ・・・連絡欄が数値ということはないと思いますので。

職員コードとした場合、コードは数字だけだとしても数値ではないので、文字列でいいのではないですか。
職員コードを加算したりとかの演算はしませんよね。
逆に、数値と文字列を混在させると、検索の時とか並べ替えの時に想定外の動作になりかねません。


一応、数字だけの場合と、数字以外が含まれている場合の判定は、下記のコードで可能です。

vba

1sData(0) = sh.Cells(i, 5).Value 2If sData(0) Like *[!0-9-9]*" Then 3 '数字(0-90-9)以外の文字が含まれていた時の処理 4Else 5 '数字(0-90-9)のみの時の処理 6End If

投稿2019/09/11 09:40

編集2019/09/11 09:49
hatena19

総合スコア34073

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

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

Naoko_Coco

2019/09/11 09:48

hatena19さん ありがとうございます。 このあと、SQLに流し込むので半角英数字のエラーチェックを行うんです。半角英数字なら問題ないんですが文字列があるとSQLではじかれてしまうので、そのために事前にエラーを出して教えるんですが、現状だとすべて文字列扱いになってしまい半角英数字のチェックにならないんです。。。
hatena19

2019/09/11 09:54

「半角英数字のエラーチェック」とは具体的にどのようなチェックですか。 半角の英字と数字のみならOKということですか。 あるいは、全角の英数字は半角に変換すればOKということですか。 明確な仕様を提示してください。
Naoko_Coco

2019/09/11 09:58

枠みたいのにどうやって書くのかできないのでベタですが、下記のように書いてます。 英数字のチェックをしたいです。逆に、」ひらがなやらカナはエラー出したいです。 Private Sub ErrCheck() Dim i As Long Dim r As Long Dim c As Long Dim Err As Boolean Dim reg As New RegExp Dim reg2 As New RegExp r = Me.Cells(Me.Rows.Count, 3).End(xlUp).Row Err = False reg.Pattern = "^[a-zA-Z0-9!-/:-@[-`{-~]+$" '半角英数字のチェック用 reg.Global = True reg.Pattern = "^[0-9]{3}-[0-9]{4}$" '郵便番号チェック reg2.Global = True Select Case Cells(8, 3).Value Case "職員マスタ" For i = 14 To r '必須項目チェック For c = 3 To 5 If Me.Cells(i, c) = "" Then Me.Cells(i, c).Interior.Color = RGB(255, 0, 0) Err = True End If Next If Len(Me.Cells(i, 4).Value) > 16 Then Me.Cells(i, 4).Interior.Color = RGB(255, 0, 0) ElseIf Len(Me.Cells(i, 5).Value) > 16 Then Me.Cells(i, 5).Value.Interior.Color = RGB(255, 0, 0) ElseIf Len(Me.Cells(i, 9).Value) > 16 Then Me.Cells(i, 9).Value.Interior.Color = RGB(255, 0, 0) ElseIf Len(Me.Cells(i, 10).Value) > 16 Then Me.Cells(i, 10).Value.Interior.Color = RGB(255, 0, 0) ElseIf Len(Me.Cells(i, 11).Value) > 16 Then Me.Cells(i, 11).Value.Interior.Color = RGB(255, 0, 0) End If '重複チェック If WorksheetFunction.CountIf(Range(Cells(14, 3), Cells(r, 3)), Cells(i, 3)) > 1 Then Me.Cells(i, 3).Interior.Color = RGB(255, 0, 0) Err = True End If '半角英数字チェック If reg.test(Cells(i, 3).Value) = False Then Cells(i, 3).Interior.Color = RGB(255, 0, 0) Err = True ElseIf Len(Cells(i, 3)) > 10 Then Cells(i, 3).Interior.Color = RGB(255, 0, 0) Err = True End If '郵便番号チェック If Cells(i, 8) <> "" Then If reg2.test(Cells(i, 8).Value) = False Then Cells(i, 8).Interior.Color = RGB(255, 0, 0) Err = True End If End If Next
hatena19

2019/09/11 10:36 編集

RegExpで英数字のチェックをしていますが、それはうまくいっているのでしょうか。 うまくいっているなら、何が問題なのでしょうか。 アルファベットやら記号も許可するなら、最初の質問の「数値なら数値として値を持ってきたい」と矛盾しています。 何をしたいのか、さっばり分かりません。
hatena19

2019/09/11 11:39

質問を小出しにせずに全体の流れを整理して提示してくだいさい。 で、現状の処理(コード)でどこが想定と違うのか、を明確にしてください。 数値を数値して扱いたい ↓ 半角英数字以外はセルを赤くしたい ↓ SQLに流し込むときにエラーになる というように質問内容が変化していますし、 かつ、すべてにおいて、曖昧で情報不足です。
Naoko_Coco

2019/09/11 12:31

説明不足でごめんなさい????????
hatena19

2019/09/12 09:15

謝られても、、、 大分、時間か経ちましたが、結局、何も説明不足が解消されてません。 説明不足な点を補うように、質問文を修正してください。 で、どこでどのような問題点が出ているのか明確にしてください。
guest

0

Dim sData(9) As String

sDataがString型で定義されているからでは?
横着せずセルごとに適切な型でそれぞれ用意してあげればよいと思います。

投稿2019/09/11 08:50

ttyp03

総合スコア17000

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

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

Naoko_Coco

2019/09/11 09:07

ttyp03さん、お久しぶりです。 いつもありがとうございます。 お客さんがどのようにデータを入れるのかがわからないので最初に数値型と決めてしまうと、読み込み時に文字列が入ってたりするとエラーになってしまいませんか?
tatsu99

2019/09/11 09:48

>お客さんがどのようにデータを入れるのかがわからないので最初に数値型と決めてしまうと、読み込み時に文字列が入ってたりするとエラーになってしまいませんか? 数値を入れるべきセルにお客さんが文字を入れた場合、どのような結果になることを望んでいるのでしょうか?
Naoko_Coco

2019/09/11 09:55

tatsu99さん データは半角英数字を想定してます。 それ以外を入れた場合にそのセルを赤くしてるんです。
ttyp03

2019/09/11 23:56

なんか仕様がよくわからんです。 「お客さんがどのようにデータを入れるのかがわからない」と言っても、コード上、職員コード、漢字氏名・・・と順番は決まっているのですよね? であれば自ずと型は決まるのではないでしょうか?
tatsu99

2019/09/12 00:17

「お客さんがどのようにデータを入れるのかがわからない」・・・の意味は 「お客さんがどのような順番でデータをいれるかわからない」ではなくて、 「お客さんが何のデータを入れるのかがわからない」という意味にも取れます。 つまり、「数字が入力されるべきセルに文字が入力されるかも知れない」・・・というようなことかと。
ttyp03

2019/09/12 00:47

なるほど。 一般的には一旦文字列で持っておいて、各セルごとに適したチェックを行えばよいだけだと思いますけどね。 となると結局何に詰まっているのかが良くわからなくなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問