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

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

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

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

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1195閲覧

win32comで、CountIf関数を使った場合のTypeError解決法を教えてください。

yujin1202

総合スコア56

VBA

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

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/01 01:46

お世話になります。
丸一日、悩んだのですが上手くいかないなので、教えてください。

右の様なA列にカラー情報があるエクセルがあります。
B列で数を数えたいと持っております。(Excel関数では、Countifを使う奴です。)
イメージ説明

エクセル上でCountif関数を設定すれば勿論出来るのですが、「python+win32com」でやろうと思っております。

====================
xl=win32com.client.Dispatch("Excel.Application")
wb = xl.Workbooks.Open(path)
ws=wb.Worksheets["Sheet1"]
ws.activate
for i in range (2,12):
<tab>xl.Cells(i,2).Value=xl.WorksheetFunction.CountIf(ws.Range("A2:A"&i),ws.Cells(i,1).Value)
==========

ただ、上記のコードを実行すると、下記エラーが発生します。


xl.Cells(i,2).Value=xl.WorksheetFunction.CountIf(ws.Range("A2:A"&i),ws.Cells(i,1).Value)
TypeError: unsupported operand type(s) for &: 'str' and 'int'


文字と数字は合体できませんと言う、よく出るエラーです。

下記部分が問題みたいな気もするのですが、やはり、どうしても分かりません。
*** ws.Range("A2:A"&i) ****

教えて頂きたく。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

質問したばかりですが、"Cells"を使って下記の様に書き直したら、想定通りに動きました。


for i in range (2,12):
<tab>xl.Cells(i,2).Value=xl.WorksheetFunction.CountIf(xl.Range(ws.Cells(2,1),ws.Cells(i,1)),ws3.Cells(i,1).Value)


Range("A2:A"&i)が動かない理由は不明ですが、とりあえず解決しております。
後学のために、Range("A2:A"&i)がダメな理由も知りたいので、もうしばらく、質問をオープンとさせていただきます。
引き続きよろしくお願いいたします。

投稿2021/04/01 02:32

編集2021/04/01 02:33
yujin1202

総合スコア56

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

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

dodox86

2021/04/01 03:18

解決されているのでこちらにコメントしますが、 > Range("A2:A"&i)がダメな理由 は、"A2:A" は文字列であるstr型、iはint型であるからです。加えて、Python3では文字列の連結は&ではなく、+を使います。 $ python3 Python 3.6.9 (default, Apr 18 2020, 01:56:04) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> i = 3 >>> type(i) <class 'int'> >>> s = "A2:A" >>> type(s) <class 'str'> なので、これを操作すると >>> s = "A2:A" & i Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for &: 'str' and 'int' >>> と、当初のエラーと同じエラーが発生します。"A2:A3"のようにしたいのであれば、例えば + str(i)としたり、formatを使えば良いです。 >>> s = "A2:A" >>> i = 3 >>> print("A2:A" + str(i)) A2:A3 >>> print("A2:A{}".format(i)) A2:A3
yujin1202

2021/04/06 06:37

詳しい御説明を、ありがとうございました。 >Python3では文字列の連結は&ではなく、+を使います。 win32comのライブラリーを利用しているので、該当部分は、エクセルでの記載になると思っていたのですが、この部分は、pythonの記載方法になるのですね。 根本的なところで、勘違いしており、恐縮です。 ありがとうございました。ベストアンサーとさせて頂きます。
dodox86

2021/04/06 07:01 編集

> 該当部分は、エクセルでの記載になると思っていたのですが、 あ、なるほど、そのように思い違いをされていたのですね。'&'がどこから来たのか私にとって謎でしたが、納得しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問